Android 以编程方式指定TableRow子维度

Android 以编程方式指定TableRow子维度,android,android-tablelayout,Android,Android Tablelayout,我试图以编程的方式创建一个TableLayout,以便创建一个具有可配置行数和列数的类似网格的布局。在布局文件中这样做可能很简单,但因为每个子元素几乎相同,并且我希望行和列计数是可配置的,所以如果可能的话,我希望以编程的方式进行 到目前为止,这就是我所拥有的 MainActivity.java private void displayBoard() { TableLayout l = (TableLayout) findViewById(R.id.GameGrid); l.set

我试图以编程的方式创建一个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);
    }
}
我基本上是在尝试创建一个按钮网格,但到目前为止,我无法更改按钮的大小,以便确保它们都适合屏幕。目前它们以标准大小显示,我对LayoutParams定义所做的任何更改都不会产生任何影响

我怀疑这个问题与我对LayoutParams的使用有关。有很多LayoutParams类与每个视图类型关联,所以可能我没有使用正确的一个?任何帮助都将不胜感激


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

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

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

r.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 15));
关于
getSpaceAt
(没有代码)。它是否以编程方式创建视图?请记住设置LayoutParams,并且对于每个视图,它应该是单独的


希望这会有帮助。

明白了!我试图操纵TableLayout和TableRows的LayoutParams,但实际上,当我将它们添加到TableRow时,我需要在按钮本身上设置TableRow.LayoutParams。这还包括指定每个子元素(按钮)的权重

private void displayBoard(){
TableLayout l=(TableLayout)findViewById(R.id.GameGrid);
l、 setLayoutParams(新的LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_父项,LinearLayout.LayoutParams.MATCH_父项);
对于(int y=0;y
TableRow.setWeightSum()用于将行的权重和设置为行中的元素数,然后将权重1传递给按钮的LayoutParams,使按钮按预期调整大小以适合屏幕

令人惊讶的是,这个答案是针对一个更一般的问题,但正是这个问题让我找到了解决方案:

Hmm,这似乎也将按钮保持在标准大小,考虑到我将15px作为参数传递给LayoutParams构造函数,我希望宽度会小得多。我添加了更多的代码细节来澄清。感谢您的建议,我相信我需要按照您的建议为每个TableRow创建一个新的LayoutParams副本。但是,为了正确调整大小,我必须在每个按钮上设置TableRow.LayoutParams(参见我的答案)。
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;
    }
}
r.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 15));
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);
    }
}