71

我正在制作一个 android 应用程序,其中有一个由数百个按钮组成的视图,每个按钮都有一个特定的回调。现在,我想使用循环设置这些回调,而不必编写数百行代码(针对每个按钮)。

我的问题是:如何使用 findViewById 而无需静态输入每个按钮 ID?这是我想做的事情:

    for(int i=0; i<some_value; i++) {
       for(int j=0; j<some_other_value; j++) {
        String buttonID = "btn" + i + "-" + j;
        buttons[i][j] = ((Button) findViewById(R.id.buttonID));
        buttons[i][j].setOnClickListener(this);
       }
    }

提前致谢!

4

8 回答 8

126

你应该使用getIdentifier()

for(int i=0; i<some_value; i++) {
   for(int j=0; j<some_other_value; j++) {
    String buttonID = "btn" + i + "-" + j;
    int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
    buttons[i][j] = ((Button) findViewById(resID));
    buttons[i][j].setOnClickListener(this);
   }
}
于 2011-02-01T16:44:20.937 回答
6

您可以尝试制作一个包含所有按钮 ID 的 int[],然后对其进行迭代:

int[] buttonIDs = new int[] {R.id.button1ID, R.id.button2ID, R.id.button3ID, ... }

for(int i=0; i<buttonIDs.length; i++) {
    Button b = (Button) findViewById(buttonIDs[i]);
    b.setOnClickListener(this);
}
于 2011-02-01T16:39:57.693 回答
3

看看这些答案:

于 2011-02-01T16:40:45.080 回答
1

如果你想访问,你可以使用标签。

onClick

int i=Integer.parseInt(v.getTag);

但是你不能像这样访问那个按钮。

只需以编程方式创建按钮

经过Button b=new Button(this);

于 2011-02-01T16:42:24.240 回答
0

在 java 代码中而不是在 Xml 中创建自定义按钮,如下所示

Button bs_text[]= new Button[some_value];

    for(int z=0;z<some_value;z++)
        {
            try
            {

            bs_text[z]   =  (Button) new Button(this);

            }
            catch(ArrayIndexOutOfBoundsException e)
            {
                Log.d("ArrayIndexOutOfBoundsException",e.toString());
            }
        }
于 2011-02-01T16:43:21.570 回答
0

如果您的顶级视图只有这些按钮视图作为子视图,您可以这样做

for (int i = 0 ; i < yourView.getChildCount(); i++) {
    Button b = (Button) yourView.getChildAt(i);
    b.setOnClickListener(xxxx);
}

如果存在更多视图,您需要检查所选视图是否是您的按钮之一。

于 2011-02-01T16:55:27.563 回答
0

简单地说,这里有一个函数

public View findViewByArrayName (String name, int i) {
        buttonID = name + Integer.toString(i);
        resID = getResources().getIdentifier(buttonID, "id", getPackageName());
        return findViewById(resID);
    }

与 Python 不同的是,Java 是一种编译语言,因此动态变量名没有任何机会可能是有道理的。除非通过像这样的某种方法来实现。

于 2021-06-22T16:34:14.110 回答
0

如果由于某种原因您不能使用该getIdentifier()功能和/或您事先知道可能的 id,您可以使用开关。

int id = 0;

switch(name) {
    case "x":
        id = R.id.x;
        break;
    etc.etc.
}

String value = findViewById(id);
于 2018-04-17T23:08:36.163 回答