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

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

您可以创建一个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 ,但我们可以使用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[30]; for (int i = 0; i < buttons.length; i++) { buttons[i] = (Button) findViewById(getIdByName("btn" + (i + 1))); } 

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

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

 Button[] buttons = new Button[10]; for (int i = 0; i < buttons.size; i++) { int id = getResources().getIdentifier("btn" + (i + 1), "id", ); buttons[i] = (Button) findViewById(id); } 

希望这可以帮助。

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

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

如果你仍然需要使用findViewById()方法初始化它们,那么无论如何它都会很难看,但仍然没有那么多的声明,这对我来说值得考虑。

使用minum代码我可以想到我会这样做:

  Button[]btn=new Button[30]; for (int i=0;i