Android: 在循环中使用带字符串/的 findViewById()

我正在制作一个 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);
}
}

先谢谢你!

55135 次浏览

您可以尝试创建一个包含所有按钮 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);
}

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

onClick

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

但是你不能这样进入那个按钮。

简单地通过编程创建按钮

作者: Button b=new Button(this);

在 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());
}
}

你应该使用 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);
}
}

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

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

如果有更多的视图出现,您需要检查如果选择的一个是您的按钮之一。

如果由于某种原因您不能使用 getIdentifier()函数,并且/或者您事先知道可能的 id,那么您可以使用一个开关。

int id = 0;


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


String value = findViewById(id);

简单地说,这是它的一个函数

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

与 Python 不同的是,Java 是一个编译语言,所以没有动态变量名的可能性也是有道理的。除非通过这种方法。