Можно ли написать цикл for, чтобы назначить слушателям много кнопок с той же функцией, где используются конечные ints?

Я пишу приложение для Android, и у меня есть 8 кнопок на одном представлении, которые имеют одну и ту же функцию, поэтому я хотел назначить одну и ту же функциональность каждой кнопке, используя цикл for, вместо того, чтобы писать 8 отдельных фрагментов кода. Однако возникает проблема, когда я хочу использовать счетчик из цикла for внутри функции onClick, чтобы помочь запустить намерение, вот код:

//array of button ids public int [] pickPlayers = { R.id.pick_player_1a, R.id.pick_player_2a, R.id.pick_player_3a, R.id.pick_player_4a, R.id.pick_player_1b, R.id.pick_player_2b, R.id.pick_player_3b, R.id.pick_player_4b}; //button to be used in for loop public Button b; //for loop to assign same functionality to buttons in pickPlayers array for(int i = 0; i<pickPlayers.length; i++){ b = (Button) findViewById(pickPlayers[i]); b.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent getContactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(getContactIntent, i); } }); }; 

Надеюсь, что все имеет смысл, благодаря любому, кто может помочь. 🙂

EDIT: Это ошибка, которую я получаю: не может ссылаться на не конечную переменную i внутри внутреннего класса, определенного другим способом

Цикл for находится в моем методе oncreate, переменные и кнопки находятся вне

Да, вы не можете получить доступ к переменной во внутренних классах, если она не объявлена ​​окончательной. Простым обходным решением будет создание класса оболочки OnClickListener.

 private class MyListener implements Button.OnClickListener { int pos; public MyListener (int position) { pos = position; } @Override public void onClick(View v) { // TODO Auto-generated method stub Intent getContactIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI); startActivityForResult(getContactIntent, pos); } } 

А затем использовать его в вашем коде, как это

 //for loop to assign same functionality to buttons in pickPlayers array for(int i = 0; i<pickPlayers.length; i++){ b = (Button) findViewById(pickPlayers[i]); b.setOnClickListener(new MyListener(i)); } 

Также, если ваши кнопки находятся в какой-либо ViewGroup, вы можете использовать getChildAt и getChildCount для их итерации

 ViewGroup parent; // initialize the parent int l = parent.getChildCount(); for (int i = 0 ; i < l ; i++) { Button button = parent.getChildAt(i); } 

Просто измените свой код следующим образом:

 //for loop to assign same functionality to buttons in pickPlayers array for(int i = 0; i<pickPlayers.length; i++){ final int index = i; b = (Button) findViewById(pickPlayers[i]); b.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent getContactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(getContactIntent, index); } }); }; 

Это должно выполнить эту работу. Удачи!

Если эти кнопки декалированы в XMl, возможно, вы должны установить android: onClick прослушиватель для них через XML?

Вы должны определить один метод в своей деятельности:

 public void myHandler(View v) { // Your stuff... } 

И добавить

 android:onClick="myHandler" 

Всем им?

Благодарю.