我如何优化包含一些重复行的代码?

时间:2013-03-19 15:28:16

标签: java android

我在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
坦克全部。

5 个答案:

答案 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个特定方法(例如getResourcesgetIdentifier)并且无法在通常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"));