我在android编程中有以下代码
Button btn1 = ( Button ) findViewById( R.id.btn1 );
Button btn2 = ( Button ) findViewById( R.id.btn2 );
Button btn3 = ( Button ) findViewById( R.id.btn3 );
Button btn4 = ( Button ) findViewById( R.id.btn4 );
Button btn5 = ( Button ) findViewById( R.id.btn5 );
Button btn6 = ( Button ) findViewById( R.id.btn6 );
Button btn7 = ( Button ) findViewById( R.id.btn7 );
Button btn8 = ( Button ) findViewById( R.id.btn8 );
Button btn9 = ( Button ) findViewById( R.id.btn9 );
它继续直到btn30
在python中,我通过下面的简单代码来优化它
#is a python syntax (for_statement)
#python work by tab
for i in range(1,31):
#in python not need to declare temp
temp="""Button btn"""+str(i)+"""=(Button)findViewById(R.id.btn"""+str(i)+""")"""
exec(temp)#a default function in python
在java编程中我该怎么做?或者我可以这样做吗?确实存在一个简单的代码吗?
UPDATE 1
所以有两种方法可以做到这一点
Code 1
:
final int number = 30;
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);
}
Code 2
:
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[30];
for (int i = 0; i < buttons.length; i++) {
buttons[i] = (Button) findViewById(getIdByName("btn" + (i + 1)));
}
另一种方式是GidView
坦克全部。
答案 0 :(得分:17)
您应重新考虑布局,而不是优化此类代码。如果屏幕上有30个按钮,则ListView
可能是更好的解决方案。您可以通过索引访问项目并处理onClick
事件,就像按钮一样。
答案 1 :(得分:17)
您可以创建Button
的数组并使用getIdentifier
方法,该方法允许您按名称获取标识符。
final int number = 30;
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;
}
}
答案 2 :(得分:5)
如果您使用Resources
类中的getIndentifier()方法,则代码将如下所示:
Button[] buttons = new Button[10];
for (int i = 0; i < buttons.size; i++) {
int id = getResources().getIdentifier("btn" + (i + 1), "id", <your-package-name>);
buttons[i] = (Button) findViewById(id);
}
希望这有帮助。
答案 3 :(得分:3)
我宁愿选择一个简单的Button
s数组。
// Just a simple code
Button [] buttons = new Button[30];
for(int i = 0; i < 30; i++)
{
buttons[i] = new Button();
}
如果您仍然需要使用findViewById()
方法对它们进行初始化,那么无论如何它都会很难看,但仍然没有那么多声明,这对我来说值得考虑。
答案 4 :(得分:1)
使用minum代码我可以想到我会这样做:
Button[]btn=new Button[30];
for (int i=0;i<btn.length;i++) btn[i] = (Button) findViewById(getResources().getIdentifier("btn"+(i+1),"id", "yourpackage"));