Один 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?

Ответ 1

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

android:onClick="onClick"

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

public void onClick(View v) {
...

Здесь документация.

Ответ 2

Попробуйте реализовать класс `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;
       ...
   }
}

Ответ 3

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

    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

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

android:onclick="onClick"

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

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

Ответ 5

Я думаю, что если ваши кнопки не находятся в 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);
}