我正在尝试以编程方式创建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对象,但按钮仍以默认大小显示。
答案 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?