以编程方式向网格布局添加 TextView,对齐方式不正确。

8

大家好,我正在尝试在GridLayout中添加带有drawableLeft的TextView。我正在循环中添加这些TextView。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);
}
5个回答

10

为此,您需要动态设置视图的列宽。这样最终将以相等的空间正确对齐每个视图。

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);

} 

11
这里的c和r是什么? - silentsudo
c是GridLayout的列索引,r是行索引。 - Waqar Khan
列和行的索引从0开始,如果有人也在疑惑。 - Marco7757
将网格项设置为等宽和等高 param.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f) param.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f) - MohammedYakub M.

4
以下代码示例应该使每个文本视图具有相等的高度和宽度,并按从左到右、从上到下的顺序排列TextViews。
关键部分是明确提供GridLayout.LayoutParams,将高度/宽度设置为0,并使用权重定义行/列规范,使高度和宽度根据权重自动计算。
还请注意我将行数设置为设施数量的函数,这样如果列表增长,您就会拥有更多的行。
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());
    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);
    } 

0

这可能是因为您的动态文本长度不固定,所以每个文本视图占用的空间不同请查看此处

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));

这段代码与编程有关。

无法完成任务 - silentsudo
你可以为TextView设置最小宽度,或者如果TextView中只有15个字符长度,则固定TextView的宽度是最简单的方法。 - Ajay Pandya

0

我的解决方案:

GridLayout gl = findViewById( R.id.grid_layout );
TextView tv = new TextView( this );
tv.setText( ""+cursor.getInt( column ) ); //for example
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.columnSpec = GridLayout.spec( GridLayout.UNDEFINED, 1, GridLayout.FILL ); //for stretch a child to column use GridLayout.FILL
gl.addView( tv, lp );
//DO NOT USE lp.setGravity( ... );
//FOR ALIGN TEXT USE tv.setTextAlignment( ... );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接