我创建了一个按钮数组,我想把它们以矩形的形式放置,像这样:
[] [] []
[] [] [](xNum为3,yNum为2)
RelativeLayout gameLayout = (RelativeLayout) findViewById(R.id.gameLayout);
x = xScreen/xNum - 20;
y = yScreen/yNum - 20;
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
int id = getResources().getIdentifier("buttons_w2", "drawable", getPackageName());
ImageView gameLogo = new ImageView(this);
RelativeLayout.LayoutParams imagelp = new RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.WRAP_CONTENT, 70);
gameLogo.setLayoutParams(imagelp);
gameLogo.setImageResource(id);
gameLayout.addView(gameLogo);
for (int i = 0; i < xNum; i++)
{
for (int j = 0; j < yNum; j++)
{
array[i][j] = new Button(this);
array[i][j].setWidth(x);
array[i][j].setHeight(y);
array[i][j].setId(createId(i, j));
if (i == 0) {
}
else {
lp.addRule(RelativeLayout.RIGHT_OF, array[i - 1][j].getId());
}
if (j == 0) {
lp.addRule(RelativeLayout.BELOW, gameLogo.getId());
}
else {
lp.addRule(RelativeLayout.BELOW, array[i][j - 1].getId());
}
array[i][j].setLayoutParams(lp);
gameLayout.addView(array[i][j]);
}
}
注:gameLogo是一个位于屏幕顶部的ImageView。另外,x和y是宽度和高度,它们是通过使用屏幕的大小减去一个位,然后除以相应行/列中的按钮数量而生成的。
下面是createId方法:
public int createId (int i, int j)
{
if (String.valueOf(i).length() == 1 && String.valueOf(j).length() == 1)
{
return Integer.parseInt("0" + i + "0" + j);
}
else if (String.valueOf(i).length() == 1)
{
return Integer.parseInt("0" + i + j);
}
else if (String.valueOf(j).length() == 1)
{
return Integer.parseInt(i + "0" + j);
}
else
{
return Integer.parseInt(i + "" + j);
}
}
我尝试了xNum为1和yNum为2。基本上,我得到了gameLogo,然后按钮层在gameLogo之上(所以你只能看到一个按钮)。为什么我的代码不能工作?
您的imageview实际上没有id。尝试在创建按钮之前设置它。
另外,你应该设置AlignParentLeft为i==0的按钮,使它们正确对齐,为每一行第一个按钮的右侧的其他按钮留下空间。
更新1:(因为我现在没有电脑,我无法验证它是否有效)
您正在为每个视图重用一个布局参数实例。在for循环中创建一个foreach Button实例。
另外将addView中的参数作为第二个参数传递。
此外,您可以显式地设置宽度和高度,尽管您在布局参数中设置了WRAP_CONTENT。在参数创建时设置宽度和高度。
更新2
现在我检查了整个代码并确定了一些点。
- 我将按钮数组设置为计算一次索引的平面数组。
- 创建Id方法错误。你的想法是好的,但是在i == j == 0的情况下,Id评估为0,这是一个无效的Id等于NO_ID打破布局。
查看更新后的代码,它实际上可以在我的设备上运行。
int x, y, xScreen, yScreen, xNum, yNum;
Button[] array;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
xScreen = size.x;
yScreen = size.y;
xNum = 3;
yNum = 2;
RelativeLayout gameLayout = (RelativeLayout) findViewById(R.id.gameLayout);
x = xScreen / xNum;
y = (int) (yScreen * 0.2);
// y = yScreen / yNum - 20;
RelativeLayout.LayoutParams lp = null;
int id = getResources().getIdentifier("buttons_w2", "drawable", getPackageName());
ImageView gameLogo = new ImageView(this);
RelativeLayout.LayoutParams imagelp = new RelativeLayout.LayoutParams(yScreen, 100);
gameLogo.setImageResource(id);
gameLogo.setId(123456);
gameLayout.addView(gameLogo, imagelp);
array = new Button[xNum * yNum];
// Row (=j) first, then column. Reflected in createId
for (int j = 0; j < yNum; ++j) {
for (int i = 0; i < xNum; ++i) {
lp = new RelativeLayout.LayoutParams(x, y);
int index = (j * xNum) + i;
int indexToLeft = (j * xNum) + (i - 1);
int indexToTop = ((j - 1) * xNum) + i;
int bid = createId(i, j);
array[index] = new Button(this);
array[index].setId(bid);
if (j == 0) {
lp.addRule(RelativeLayout.BELOW, gameLogo.getId());
} else {
lp.addRule(RelativeLayout.BELOW, array[indexToTop].getId());
}
if (i == 0) {
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
} else {
lp.addRule(RelativeLayout.RIGHT_OF, array[indexToLeft].getId());
}
gameLayout.addView(array[index], lp);
}
}
}
public int createId(int i, int j) {
// Add 1 to each index value copied to this function, since the generated ID might
// evaluate to 0, which is an invalid id!
i += 1;
j += 1;
if (String.valueOf(i).length() == 1 && String.valueOf(j).length() == 1) {
return Integer.parseInt(String.format("0%d0%d", j, i));
} else if (String.valueOf(i).length() == 1) {
return Integer.parseInt(String.format("0%d%d", j, i));
} else if (String.valueOf(j).length() == 1) {
return Integer.parseInt(String.format("%d0%d", j, i));
} else {
return Integer.parseInt(String.format("%d%d", j, i));
}
}
一些备注:- createId可以通过始终返回三个或两个id减少到一个格式和一个调用删除if-else块来优化。
- indexToTop只需要每行递增计算一次,即:
indexToTop = (j - 1) * xNum;