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



我创建了一个按钮数组,我想把它们以矩形的形式放置,像这样:

[] [] []

[] [] [](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
现在我检查了整个代码并确定了一些点。

  1. 我将按钮数组设置为计算一次索引的平面数组。
  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;

相关内容

  • 没有找到相关文章

最新更新