我正在创建一个Android应用程序,其中有一个由数百个按钮组成的视图,每个按钮都有一个特定的回调。现在,我想使用循环设置这些回调,而不是必须编写数百行代码(对于每个按钮)。
我的问题是:如何在没有静态输入每个按钮ID的情况下使用findViewById? 这就是我想做的事情:
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);
}
}
提前致谢!
答案 0 :(得分:98)
您应该使用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", PackageName());
buttons[i][j] = ((Button) findViewById(resID));
buttons[i][j].setOnClickListener(this);
}
}
答案 1 :(得分:4)
你可以尝试制作一个包含所有按钮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);
}
答案 2 :(得分:3)
看看这些答案:
答案 3 :(得分:1)
如果要访问,可以使用标记。
onClick
中的
int i=Integer.parseInt(v.getTag);
但你不能像这样访问那个按钮。
只需以编程方式创建按钮
Button b=new Button(this);
答案 4 :(得分: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());
}
}
答案 5 :(得分:0)
如果您的顶级视图仅将这些按钮视图作为子视图,则可以执行
for (int i = 0 ; i < yourView.getChildCount(); i++) {
Button b = (Button) yourView.getChildAt(i);
b.setOnClickListener(xxxx);
}
如果有更多视图,您需要检查所选视图是否是您的按钮之一。
答案 6 :(得分:0)
如果由于某种原因您无法使用getIdentifier()
功能和/或您事先知道可能的ID,则可以使用开关。
int id = 0;
switch(name) {
case "x":
id = R.id.x;
break;
etc.etc.
}
String value = findViewById(id);
答案 7 :(得分:0)
简单来说,这是一个函数
record
同样与 Python 不同的是,Java 是一种编译语言,因此没有任何机会使用动态变量名称可能是有道理的。除非通过像这样的某种方法来实现。