Android: Использование findViewById() со строкой/в цикле
Я делаю приложение для 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);
}
}
Спасибо заранее!
Ответы
Ответ 1
Вы должны использовать 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);
}
}
Ответ 2
Вы можете попробовать сделать 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
Взгляните на эти ответы:
Ответ 4
вы можете использовать тег, если хотите получить доступ.
in onClick
int i=Integer.parseInt(v.getTag);
Но вы не можете получить доступ к этой кнопке.
просто создайте кнопку программно
Button b=new Button(this);
Ответ 5
создать пользовательскую кнопку в 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());
}
}
Ответ 6
Если ваш вид верхнего уровня имеет только те представления кнопок, что и дети, вы можете сделать
for (int i = 0 ; i < yourView.getChildCount(); i++) {
Button b = (Button) yourView.getChildAt(i);
b.setOnClickListener(xxxx);
}
Если присутствует больше просмотров, вам нужно будет проверить, является ли выбранная вами одна из ваших кнопок.
Ответ 7
Если по какой-либо причине вы не можете использовать getIdentifier()
и/или заранее знаете возможный идентификатор, вы можете использовать переключатель.
int id = 0;
switch(name) {
case "x":
id = R.id.x;
break;
etc.etc.
}
String value = findViewById(id);