Передать аргумент при вызове setOnClickListener? - PullRequest
4 голосов
/ 09 февраля 2012

Можно ли передать аргумент слушателю при нажатии кнопки:

protected void onCreate(Bundle savedInstanceState) {
    ....

    String myArg = "Hello";
    Button button1 = (Button)findViewById(R.id.myButton);
    button1.setOnClickListener(myListener);

    String myArg = "Goodye";
    Button button2 = (Button)findViewById(R.id.myOtherButton);
    button2.setOnClickListener(myListener);
}

OnClickListener clickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
            // print the value from the passed in argument myArg
        Log.v("TEST", myArg);           
    }
};

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

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

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

К вашему сведению: мое реальное использование требует, чтобы аргумент был объектом View.

Ответы [ 2 ]

6 голосов
/ 09 февраля 2012

Я думаю, что типичным способом решения этой проблемы является проверка идентификатора цели клика:

OnClickListener clickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.myButton) {
             //
        } elseif (v.getId()==R.id.myOtherButton) {
             //
        }       
    }
};

Если этого недостаточно, вы можете использовать общее свойство тега представления:

Button button1 = (Button)findViewById(R.id.myButton);
button1.setTag("Hello");
button1.setOnClickListener(myListener);

Button button2 = (Button)findViewById(R.id.myOtherButton);
button2.setTag("Goodye");
button2.setOnClickListener(myListener);

...
OnClickListener clickListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
        // print the value from the passed in argument myArg
    Log.v("TEST", v.getTag());           
   }
};

И, наконец, вы даже можете установить несколько тегов:

 button1.setTag(R.id.arg1, "Hello");
 button1.setTag(R.id.arg2, "World");

Подходит ли это для ваших целей?

5 голосов
/ 09 февраля 2012

Почему бы просто не создать класс, который реализует View.OnClickListener?Это было бы идеально, если вы повторно используете код для каждой кнопки.

public class MyListener implements View.OnClickListener 
{
    private View mView;

    public MyListener(View v) {
        mView = v;
    }

    @Override
    public void onClick(View v) {
        // Use mView here if needed             
    }
}

А затем используйте его, как обычно:

OnClickListener listener = new MyListener(myView);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...