One OnClickHandler for multiple Buttons

2019-01-06 09:56发布

I find myself doing things like this all the time:

    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);
...

and

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

Is there a better way to set the OnClickListener?

6条回答
姐就是有狂的资本
2楼-- · 2019-01-06 10:37

I think in case, when your buttons are not in Activity but in FragmentDialog, etc., this can help

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);
}
查看更多
趁早两清
3楼-- · 2019-01-06 10:38

If you want to do less code for click listeners you have this lib [http://jakewharton.github.io/butterknife/]

you just have to do this

 @OnClick({ R.id.button1, R.id.button2, R.id.button3 })
public void doSomething(View button) {
    //do whatever you want
    button.changeWhateverInTheView();
}
查看更多
疯言疯语
4楼-- · 2019-01-06 10:43

Have your class implement `View.OnClickListener', like

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;
       ...
   }
}
查看更多
一纸荒年 Trace。
5楼-- · 2019-01-06 10:44

Gettin @foenix answer, you can simply do something like:

    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
   }
};
查看更多
叼着烟拽天下
6楼-- · 2019-01-06 10:46

It should be noted, that

android:onclick="onClick"

requires at least Andoid SDK 1.6. So if you want your App to be accessible to as big audience as possible, you probably want to write your App against Android 1.6. Unless your App requires a feature which is only available in 1.6+. So while your first attempt is bit more of work, it has greater backwards compatibility. I usually do it the way you do, to keep my Apps 1.5 comptaible.

Edit: It's easy to overlook this, if you set up Android 2.2 as SDK in your projects settings, but set minSDK version to 3 (1.5), as it doesn't give compiler errors.

查看更多
姐就是有狂的资本
7楼-- · 2019-01-06 10:51

You can also set it in your layout xml using the android:onclick attribute.

android:onClick="onClick"

Then in your activity class add the onClick method.

public void onClick(View v) {
...

Here's the documentation.

查看更多
登录 后发表回答