我有16个按钮,其名称为“button1”,“button2”,依此类推。有没有办法可以使用for循环迭代它们,通过以某种方式在每次迭代时附加数值?像这样:
for(int i = 1; i<17; i++ ){
Button b = (Button)findViewById(R.id.buttoni);
我知道我可以简单地初始化onCreate()方法中的每个按钮,但我只是好奇我是否可以用类似于我的示例代码的方式来完成它。
谢谢。
答案 0 :(得分:3)
您可以使用getIdentifier
:
for(int i = 1; i<17; i++ ){
int buttonId = getResources().getIdentifier("button"+i, "id", getPackageName());
Button b = (Button)findViewById(buttonId);
//Your stuff with the button
}
答案 1 :(得分:1)
您可以创建Button
的数组并使用getIdentifier
方法,该方法允许您按名称获取标识符。
final int number = 17;
final Button[] buttons = new Button[number];
final Resources resources = getResources();
for (int i = 0; i < number; i++) {
final String name = "btn" + (i + 1);
final int id = resources.getIdentifier(name, "id", getPackageName());
buttons[i] = (Button) findViewById(id);
}
如果有人对如何仅使用Java获得相同结果感兴趣
上述解决方案使用Android
个特定方法(例如getResources
,getIdentifier
)并且无法在通常Java
中使用,但我们可以使用{{1并编写一个类似于reflection
的方法:
getIdentifier
然后:
public static int getIdByName(final String name) {
try {
final Field field = R.id.class.getDeclaredField(name);
field.setAccessible(true);
return field.getInt(null);
} catch (Exception ignore) {
return -1;
}
}
final Button[] buttons = new Button[17];
for (int i = 0; i < buttons.length; i++) {
buttons[i] = (Button) findViewById(getIdByName("btn" + (i + 1)));
}
您应重新考虑布局,而不是优化此类代码。如果屏幕上有17个按钮,则ListView可能是更好的解决方案。您可以通过索引访问项目并处理onClick事件,就像使用按钮一样。