Android: использование findViewById () со строкой / в цикле - PullRequest
57 голосов
/ 01 февраля 2011

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

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

Заранее спасибо!

Ответы [ 7 ]

100 голосов
/ 01 февраля 2011

Вы должны использовать 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);
   }
}
4 голосов
/ 01 февраля 2011

Вы можете попробовать сделать 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);
}
1 голос
/ 01 февраля 2011

Вы можете использовать тег, если хотите получить доступ.

в onClick

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

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

просто создайте кнопкупрограммно

Button b=new Button(this);

0 голосов
/ 18 апреля 2018

Если по какой-либо причине вы не можете использовать функцию getIdentifier() и / или заранее знаете возможные идентификаторы, вы можете использовать переключатель.

int id = 0;

switch(name) {
    case "x":
        id = R.id.x;
        break;
    etc.etc.
}

String value = findViewById(id);
0 голосов
/ 01 февраля 2011

Если ваш вид верхнего уровня имеет только те виды кнопок, которые являются дочерними, вы можете сделать

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

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

0 голосов
/ 01 февраля 2011

создать пользовательскую кнопку в коде 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());
            }
        }
...