Можно ли написать цикл for для назначения слушателей многим кнопкам с той же функцией, где используются последние целые числа? - PullRequest
3 голосов
/ 12 июля 2011

Я пишу приложение для 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);
            }
        });
    };

Надеюсь, что все имеет смысл, спасибо всем, кто может помочь. :)

РЕДАКТИРОВАТЬ: Это ошибка, которую я получаю: не может ссылаться на не финальную переменную i внутри внутреннего класса, определенного в другом методе

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

Ответы [ 3 ]

8 голосов
/ 12 июля 2011

Да, вы не можете получить доступ к переменной во внутренних классах, если она не объявлена ​​как final.Простой обходной путь - создать класс-оболочку 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);
}
1 голос
/ 12 июля 2011

Просто измените свой код так:

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

Это должно сделать работу. Удачи!

0 голосов
/ 12 июля 2011

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

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

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

И добавить

android:onClick="myHandler" 

всем им?

Спасибо.

...