以编程方式指定TableRow子维度

时间:2014-10-11 05:12:15

标签: android android-tablelayout

我正在尝试以编程方式创建TableLayout,以便使用可配置的行和列计数制作类似网格的布局。这在布局文件中可能是微不足道的,但是因为每个子元素几乎相同,并且我希望行和列计数是可配置的,所以如果可能的话我想以编程方式进行。

到目前为止,这就是我所拥有的。

MainActivity.java

private void displayBoard() {
    TableLayout l = (TableLayout) findViewById(R.id.GameGrid);
    l.setLayoutParams(new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

    for (int y = 0; y < b.height(); y++) {
        TableRow r = new TableRow(this);
        r.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, 15));
        for (int x = 0; x < b.width(); x++) {
            r.addView(b.getSpaceAt(x, y));
        }
        l.addView(r);
    }
}

Board.java

for (int y = 0; y < spaces.length; y++) {
    for (int x = 0; x < spaces[0].length; x++) {
        spaces[y][x] = new BoardSpace(context, x, y);
    }
}

BoardSpace.java

public class BoardSpace extends Button {
    private ReversiPiece piece;
    protected int x, y;

    private BoardSpace(Context c) {
        super(c);
    }

    public BoardSpace(Context c, int x, int y) {
        super(c);
    //  this.setWidth(25); // Doesn't make a difference, either
    //  this.setHeight(15); // Doesn't make a difference, either
        piece = null;
        this.x = x;
        this.y = y;
    }

    public ReversiPiece piece() {
        return piece;
    }

    public void setPiece(ReversiPiece p) {
        piece = p;
    }
}

我基本上是想创建一个按钮网格,但到目前为止我无法更改按钮的大小,所以我可以确保它们都适合屏幕。目前它们以标准尺寸出现,我对LayoutParams定义所做的任何更改都没有什么区别。

我怀疑这个问题与我对LayoutParams的使用有关。每种View类型都有很多LayoutParams类,所以也许我没有使用正确的类?任何帮助将不胜感激。

编辑:现在根据氰化物的推荐为每个TableRow创建一个新的TableLayout.LayoutParams对象,但按钮仍以默认大小显示。

2 个答案:

答案 0 :(得分:1)

你是对的,关于LayoutParams,不能在视图之间共享:每个视图都应该有自己的LayoutParams副本。

换句话说,这就是你需要的:

r.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 15));

关于getSpaceAt(没有代码)。它是否以编程方式创建视图?请记住设置LayoutParams并再次为每个视图分别。

希望它会有所帮助。

答案 1 :(得分:0)

知道了!我试图操纵我的TableLayout和TableRows的LayoutParams,实际上当我将它们添加到TableRow时,我需要在按钮上设置TableRow.LayoutParams。这涉及指定每个子元素(Button)的权重。

private void displayBoard() {
    TableLayout l = (TableLayout) findViewById(R.id.GameGrid);
    l.setLayoutParams(new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));

    for (int y = 0; y < b.height(); y++) {
        TableRow r = new TableRow(this);
        r.setWeightSum(b.width());
        for (int x = 0; x < b.width(); x++) {
            BoardSpace s = b.getSpaceAt(x, y);
            s.setLayoutParams(new TableRow.LayoutParams(
                    TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT, 1.0f));
            r.addView(s);
        }
        l.addView(r);
    }
}

TableRow.setWeightSum()用于将行的权重总和设置为行中元素的数量,然后将权重1传递给按钮的LayoutParams,使按钮调整大小以适应屏幕,按预期。

令人惊讶的是,这个答案是针对一个更通用的问题,但这是导致我找到解决方案的原因: How to set layout_weight attribute dynamically from code?