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

したがって、それを行うには2つの方法があります
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

この種のコードを最適化する代わりに、レイアウトを再考する必要があります。画面に30個のボタンがある場合は、ListViewおそらくaがより良い解決策です。ボタンと同じように、インデックスを介してアイテムにアクセスし、onClickイベントを処理できます。

于 2013-03-19T15:32:48.227 に答える
17

の配列を作成し、その名前で識別子を取得できるメソッドを使用できますButtongetIdentifier

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できます。reflectiongetIdentifier

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 に答える
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

Button単純なsの配列を使用したいと思います。

// 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 に答える