2011-02-01 22 views
48

私はアンドロイドアプリケーションを作成しています。そこには、それぞれ特定のコールバックを持つ数百のボタンからなるビューがあります。今、これらのコールバックをループを使用して設定したいと思います(ボタンのそれぞれに対して数百行のコードを書く必要はありません)。Android:ループ内の文字列でfindViewById()を使用する

私の質問は:どのように静的に各ボタンのIDを入力することなくfindViewByIdを使用することができますか?ここ は私がやりたいものです:事前に

for(int i=0; i<some_value; i++) { 
     for(int j=0; j<some_other_value; j++) { 
     String buttonID = "btn" + i + "-" + j; 
     buttons[i][j] = ((Button) findViewById(R.id.buttonID)); 
     buttons[i][j].setOnClickListener(this); 
     } 
    } 

ありがとう!

答えて

81

以下のようにではなくXMLでJavaコードでカスタムボタンを作成するプログラム的

+0

ありがとう、それは私が探していたものでした。 – user573536

+21

"com.sample.project"はgetPackageName()に置き換えることができます。 – jenzz

+0

私はこれに非常に類似した他の答えを見たことがありますが、2番目の引数が "id"であったのは、それが動作するために必要な最後のものでした。 –

3

あなたは作ってみることができ、あなたのボタンIDのすべてを保持し、その反復処理のint []:

int[] buttonIDs = new int[] {R.id.button1ID, R.id.button2ID, R.id.button3ID, ... } 

for(int i=0; i<buttonIDs.length; i++) { 
    Button b = (Button) findViewById(buttonIDs[i]); 
    b.setOnClickListener(this); 
} 
3
+1

@ user573536ループ内で 'getResources()。getIdentifier()'を使用すると、検索回数が多いとパフォーマンスが低下する可能性があることに注意してください。 –

+0

あなたは正しいです。私は、リソースのシーケンスやオーダーがあり、それらがたくさんある場合(50個のリソースの配列を作成するときにのみ)、そのアプローチをお勧めします。 – Cristian

1

アクセスしたい場合はタグを使用できます。 onClick

int i=Integer.parseInt(v.getTag); 

しかし、あなたは、このようにそのボタンにアクセス傾けます。

は、単にあなたがgetIdentifier()

for(int i=0; i<some_value; i++) { 
    for(int j=0; j<some_other_value; j++) { 
    String buttonID = "btn" + i + "-" + j; 
    int resID = getResources().getIdentifier(buttonID, "id", getPackageName()); 
    buttons[i][j] = ((Button) findViewById(resID)); 
    buttons[i][j].setOnClickListener(this); 
    } 
} 
0

でボタンを作成しますあなたのトップレベルのビューには複数のビューがある場合は、子供のようにトンのビューは、あなたが

for (int i = 0 ; i < yourView.getChildCount(); i++) { 
    Button b = (Button) yourView.getChildAt(i); 
    b.setOnClickListener(xxxx); 
} 

を行うことができますが、選択された一つは、あなたのボタンのいずれかであるかどうかを確認する必要があると思い提示します。

0

の場合を使用する必要があり、私は

Button bs_text[]= new Button[some_value]; 

    for(int z=0;z<some_value;z++) 
     { 
      try 
      { 

      bs_text[z] = (Button) new Button(this); 

      } 
      catch(ArrayIndexOutOfBoundsException e) 
      { 
       Log.d("ArrayIndexOutOfBoundsException",e.toString()); 
      } 
     } 
+0

パフォーマンスが他の推奨されている方法とどのように比較されるか知っていますか?私はそれがIDの配列よりも少し遅いと思うだろうが、 'getResources()。getIdentifier()'と比較する方法を知りたいと思うだろう。 –

+0

ごめんなさい。ビューは彼の子供を知っているので、私はそれがあまりにも悪いとは思わない。 –

関連する問題