13

我在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

4

5 回答 5

17

Button您可以创建一个's数组并使用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,但是我们可以使用 areflection并编写一个类似于 a 的方法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[30];

for (int i = 0; i < buttons.length; i++) {
    buttons[i] = (Button) findViewById(getIdByName("btn" + (i + 1)));
}
于 2013-03-19T15:38:36.613 回答
17

而不是优化这种代码,你应该重新考虑你的布局。如果屏幕上有 30 个按钮,aListView可能是更好的解决方案。您可以通过索引访问项目并处理onClick事件,就像使用按钮一样。

于 2013-03-19T15:32:48.227 回答
5

如果您使用该类中的getIndentifier()方法Resources,您的代码将如下所示:

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);
}
于 2013-03-19T15:41:04.130 回答
3

我宁愿选择一个简单的Buttons 数组。

// Just a simple code
Button [] buttons = new Button[30];
for(int i = 0; i < 30; i++)
{
    buttons[i] = new Button();
}

如果还需要用findViewById()方法来初始化的话,反正会很丑,但还是不会有那么多声明,这对我来说是值得考虑的。

于 2013-03-19T15:40:46.383 回答
1

使用我能想到的最小代码,我会这样做:

   Button[]btn=new Button[30];
  for (int i=0;i<btn.length;i++)  btn[i] = (Button) findViewById(getResources().getIdentifier("btn"+(i+1),"id", "yourpackage"));
于 2013-03-19T15:41:12.117 回答