Подтвердить что ты не робот

Как я могу оптимизировать этот код, который содержит некоторую повторяющуюся строку?

У меня есть код в программировании для 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

SO есть два способа сделать это
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
Танки Все.

4b9b3361

Ответ 1

Вы можете создать массив 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, но мы можем использовать 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)));
}

Ответ 2

Вместо оптимизации такого кода вы должны пересмотреть свой макет. Если у вас есть 30 кнопок на экране, ListView, вероятно, лучшее решение. Вы можете получить доступ к элементам через индекс и обрабатывать события onClick точно так же, как с помощью кнопок.

Ответ 3

Если вы используете метод 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);
}

Надеюсь, что это поможет.

Ответ 4

Я бы предпочел использовать простой массив Button s.

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

Если вам все еще нужно инициализировать их с помощью метода findViewById(), он будет уродливым в любом случае, но все равно не будет столько деклараций, которые стоит рассмотреть для меня.

Ответ 5

С минимальным кодом я могу подумать, что сделаю это:

   Button[]btn=new Button[30];
  for (int i=0;i<btn.length;i++)  btn[i] = (Button) findViewById(getResources().getIdentifier("btn"+(i+1),"id", "yourpackage"));