【问题标题】:Programmatically adding TextView to Grid Layout alignment not proper以编程方式将 TextView 添加到网格布局对齐不正确
【发布时间】:2016-02-29 06:10:17
【问题描述】:

您好,我正在尝试将带有 drawableLeft 的 TextView 添加到 GridLayout。 我在循环中添加这个 TextView。 TextView 已正确添加,但未正确对齐。每个文本视图应该在一个水平行中采用相同的宽度,这不会发生。

以下是我正在使用的代码

    GridLayout gridLayout = new GridLayout(getContext());
            gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
            gridLayout.setColumnCount(2);
            gridLayout.setRowCount(3);
            TextView titleText;
            for (int i = 0; facilities != null && i < facilities.size(); i++) {
                titleText = new TextView(getContext());
                titleText.setText(facilities.get(i));
                gridLayout.addView(titleText, i);
                titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);
}

【问题讨论】:

    标签: android dynamic android-gridlayout


    【解决方案1】:

    以下代码示例应为每个文本视图提供相同的高度和宽度,并从左到右然后从上到下对 TextView 进行排序。

    关键部分是显式提供 GridLayout.LayoutParams,将高度/宽度设置为 0,并定义权重设置为 1 的行/列规范,以便根据权重自动计算高度和宽度。

    另请注意,我将行数设置为设施数的函数,这样如果您的列表增加,您将拥有更多行。

    if (facilities == null) {
        // In this case there is nothing to display. You can adjust this part to your needs.
        return;
    }
    
    GridLayout gridLayout = new GridLayout(getContext());
    gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
    gridLayout.setColumnCount(2);
    gridLayout.setRowCount(facilities.size() / 2);
    for (int i = 0; i < facilities.size(); i++) {
        TextView titleText = new TextView(getContext());
        titleText.setText(facilities.get(i));
        titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);
    
        GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
        layoutParams.height = 0;
        layoutParams.width = 0;
        int currentCol = i % 2;
        int currentRow = i / 2;
        // The last parameter in the specs is the weight, which gives equal size to the cells
        layoutParams.columnSpec = GridLayout.spec(currentCol, 1, 1);
        layoutParams.rowSpec = GridLayout.spec(currentRow, 1, 1);
    
        // Optional, if you want the text to be centered within the cell
        layoutParams.setGravity(Gravity.CENTER);
    
        gridLayout.addView(titleText, layoutParams);
    } 
    

    【讨论】:

      【解决方案2】:

      为此,您必须动态设置视图的列宽。这最终将使每个视图与等量的空间正确对齐。

      GridLayout gridLayout = new GridLayout(getContext());
                  gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
                  gridLayout.setColumnCount(2);
                  gridLayout.setRowCount(3);
                  TextView titleText;
                  for (int i = 0; facilities != null && i < facilities.size(); i++) {
                      titleText = new TextView(getContext());
                      titleText.setText(facilities.get(i));
                      gridLayout.addView(titleText, i);
                      titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);
                      GridLayout.LayoutParams param =new GridLayout.LayoutParams();
                      param.height = LayoutParams.WRAP_CONTENT;
                      param.width = LayoutParams.WRAP_CONTENT;
                      param.rightMargin = 5;
                      param.topMargin = 5;
                      param.setGravity(Gravity.CENTER);
                      param.columnSpec = GridLayout.spec(c);
                      param.rowSpec = GridLayout.spec(r);
                      titleText.setLayoutParams (param);
      
      } 
      

      【讨论】:

      • 这里的c和r是什么?
      • c 是列索引,r 是 GridLayout 的行索引
      • 列和行索引从 0 开始,如果有人想知道的话。
      • 这可能对某人有帮助。放置宽度和高度相等的网格项 param.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f) param.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f)
      【解决方案3】:

      基本上就是列数和行数。我已经重写了完整的逻辑

      GridLayout gridLayout = new GridLayout(getContext());
          int total = facilities.size();
          int column =  2;
          int row = total / column;
          gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS);
          gridLayout.setColumnCount(column);
          gridLayout.setRowCount(row + 1);
          TextView titleText;
          for(int i =0, c = 0, r = 0; i < total; i++, c++)
          { 
              if(c == column)
              { 
                  c = 0;
                  r++;
              } 
               titleText = new TextView(getContext());
               titleText.setText(facilities.get(i));
               gridLayout.addView(titleText, i);
               titleText.setCompoundDrawablesWithIntrinsicBounds(rightIc, 0, 0, 0);
               GridLayout.LayoutParams param =new GridLayout.LayoutParams();
               param.height = LayoutParams.WRAP_CONTENT;
               param.width = LayoutParams.WRAP_CONTENT;
               param.rightMargin = 5;
               param.topMargin = 5;
               param.setGravity(Gravity.CENTER);
               param.columnSpec = GridLayout.spec(c);
               param.rowSpec = GridLayout.spec(r);
               titleText.setLayoutParams (param);
          } 
      

      【讨论】:

        【解决方案4】:

        这可能是因为您的动态文本长度不固定,所以每个文本视图不占用相同的空间Check this

        int height=getContext().getResources().getDimension(R.dimen.activity_horizontal_margin); //set size of dimen in required resolution
        

        titleText .setLayoutParams(new LinearLayout.LayoutParams(0, height, height));

        【讨论】:

        • 文本最多 15 个字符
        • 您可以设置 textview 的最小宽度,或者如果您在 textview 中只有 15char 长度,则修复 textview 宽度是最简单的方法
        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 2020-01-29
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多