如何在按钮数组中定位按钮(Android)

时间:2015-08-10 19:32:05

标签: java android arrays button multidimensional-array

我用按钮做了一个数组,我想把它们放在一个矩形的形式,如下所示:

[] [] []

[] [] []  (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上面的Buttons(所以你只能看到一个按钮)。为什么我的代码不起作用?

1 个答案:

答案 0 :(得分:0)

您的imageview实际上没有ID。 尝试在创建按钮之前进行设置。

此外,您应该将AlignParentLeft设置为带有i == 0的按钮,以使它们正确对齐,为每行中第一个按钮的右边的其他按钮留出空间。

更新1 :(由于我暂时没有计算机,我无法验证它是否有效)

您正在重复使用foreach视图中的一个布局参数实例。在for循环中创建一个foreach按钮实例。

另外,将addView中的参数作为第二个参数传递。

此外,尽管在布局参数中设置了WRAP_CONTENT,但仍然明确地设置了宽度和高度。在创建参数时设置宽度和高度。

更新2
我现在查看了整个代码并确定了一些要点。

  1. 我使按钮数组成为一个计算索引一次的平面数组。
  2. create Id方法错误。您的想法很好,但是在i == j == 0的情况下,Id评估为0,这是一个无效的ID,等于NO_ID打破了布局。
  3. 请参阅此更新代码,该代码实际上适用于我的设备。

    <img src="../../image.jpg" />
    

    一些评论:

    • 可以通过始终将三个或两个id减少为一种格式并且一次调用删除if-else-blocks来优化createId。
    • indexToTop只需要按行增量计算一次,即:
      

    indexToTop =(j - 1)* xNum;