Один OnClickHandler для нескольких кнопок - PullRequest
46 голосов
/ 26 сентября 2010

Я все время так поступаю:

    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 ]

59 голосов
/ 26 сентября 2010

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

android:onClick="onClick"

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

public void onClick(View v) {
...

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

35 голосов
/ 26 сентября 2010

Пусть ваш класс реализует `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;
       ...
   }
}
5 голосов
/ 28 марта 2014

Gettin @foenix answer, вы можете просто сделать что-то вроде:

    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
   }
};
4 голосов
/ 26 сентября 2010

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

android:onclick="onClick"

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

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

1 голос
/ 28 ноября 2012

Я думаю, что в случае, когда ваши кнопки не в 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);
}
0 голосов
/ 02 февраля 2018

Если вы хотите сделать меньше кода для прослушивателей кликов, у вас есть эта библиотека [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();
}
...