Один OnClickHandler для нескольких кнопок

Я постоянно делаю такие вещи:

    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    Button button3 = (Button) findViewById(R.id.button3);

    button1.setOnClickListener(menuButtonListener);
    button2.setOnClickListener(menuButtonListener);
    button3.setOnClickListener(menuButtonListener);
...

а также

   private OnClickListener myButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
      switch(v.getId()){
       case R.id.button1 :
    ...

Есть ли лучший способ установить OnClickListener?

Ответы на вопрос(6)

у вас есть эта библиотека [http://jakewharton.github.io/butterknife/]

ты просто должен сделать это

 @OnClick({ R.id.button1, R.id.button2, R.id.button3 })
public void doSomething(View button) {
    //do whatever you want
    button.changeWhateverInTheView();
}

что в случае, когда ваши кнопки находятся не в Activity, а во FragmentDialog и т. Д., Это может помочь

Context mContext = getActivity().getBaseContext();
mRes = mContext.getResources();
String[] idOfButtons = { "button1", "button2", "button3"};
for (int pos = 0; pos < idOfButtons.length; pos++) {
   Integer btnId = mRes.getIdentifier(idOfButtons[pos], "id",(getActivity()).getBaseContext().getPackageName());
    ImageButton ib = (ImageButton) v.findViewById(btnId);
    ib.setOnClickListener(this.onClickNum);
}

    int[] buttons = {R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7
            , R.id.button8, R.id.button9};
    for (int i = 0; i < buttons.length; i++) {
        Button buttonNum = (Button) rootView.findViewById(buttons[i]);
        buttonNum.setOnClickListener(doSomething);
    }

private OnClickListener doSomething= new OnClickListener() {
     @Override
     public void onClick(View v) {
            //doSomething
   }
};
Решение Вопроса

Вы также можете установить его в своем макете XML с помощью атрибута android: onclick.

android:onClick="onClick"

Затем в вашем классе деятельности добавьте метод onClick.

public void onClick(View v) {
...

Вотдокументация.

 Tiago11 сент. 2014 г., 00:42
@Orion И этот подход, и подход mseo будут работать и для динамически создаваемых кнопок.
 Orion21 мар. 2014 г., 00:15
Что делать, если кнопки создаются динамически?
 mseo25 сент. 2010 г., 22:40
Ах, приятно :) Коротко и эффективно. Мне это нравится!

Пусть ваш класс реализует `View.OnClickListener ', например

public class MyActivity extends Activity implements View.OnClickListener {

    Button button1, button2, button3;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate();

        ...

        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button3 = (Button) findViewById(R.id.button3);

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
   }

   @Override
   public void onClick(View v) {
       switch(v.getId()) {
           case R.id.button1:
           // do stuff;
           break;
           case R.id.button2:
           // do stuff;
           break;
       ...
   }
}
 Kai Wang08 июл. 2016 г., 15:47
должен быть правильный ответ.
 user74203031 мая 2012 г., 22:57
Кажется, это хорошо работает для фрагментов действий, расширяющих
 Ruchir Baronia29 нояб. 2015 г., 04:57
понравилось! Как это работает, хотя ...?
 mseo25 сент. 2010 г., 22:39
Ну ... не спасает меня много работы. Это еще одна возможность сделать это, но на самом деле она не короче и не элегантнее моего подхода.

Следует отметить, что

android:onclick="onClick"

требуется хотя бы Andoid SDK 1.6. Поэтому, если вы хотите, чтобы ваше приложение было доступно как можно большей аудитории, вы, вероятно, захотите написать свое приложение для Android 1.6. Если ваше приложение не требует функции, которая доступна только в 1.6+. Так что, хотя ваша первая попытка немного больше работы, она имеет большую обратную совместимость. Я обычно делаю это так, как вы делаете, чтобы мои Apps 1.5 были совместимы.

Редактировать: это легко пропустить, если вы настроили Android 2.2 в качестве SDK в настройках своего проекта, но установили версию minSDK на 3 (1.5), так как это не дает ошибок компилятора.

Ваш ответ на вопрос