2011-02-01 3 views
48

Я делаю приложение для Android, где есть представление, состоящее из сотен кнопок, каждый со специальным обратным вызовом. Теперь я хотел бы установить эти обратные вызовы, используя цикл, вместо того, чтобы писать сотни строк кода (для каждой из кнопок).Android: Использование findViewById() со строкой/в цикле

Мой вопрос: Как я могу использовать 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

создать Вы должны с помощью 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

Спасибо, это было то, что я искал. – user573536

+21

«com.sample.project» можно заменить getPackageName(). – jenzz

+0

Я видел другие ответы, очень похожие на это, но второй аргумент, являющийся «id», был последним, что мне нужно для его работы. –

3

Вы можете попробовать сделать ИНТ [], который содержит все ваши идентификаторы кнопок, а затем перебрать, что:

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); 

Но вы не можете получить доступ к этой кнопке, как это.

просто кнопку программно

по

0

создать пользовательскую кнопку в Java коде, а в Xml, как я показано ниже

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

If в вашем представлении верхнего уровня есть только те, просмотры тонные, как дети, вы могли бы сделать

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

Если есть больше просмотров представить вам нужно проверить, если выбран один является один из ваших кнопок.

+0

Вы знаете, как производительность сравнивается с другими предложенными методами? Я предполагаю, что он был немного медленнее, чем массив ID, но мне было бы интересно узнать, как он сравнивается с 'getResources(). GetIdentifier()'. –

+0

Ничего страшного. Взгляд знает своих детей, поэтому я не думаю, что это слишком плохо. –

Смежные вопросы