46

我发现自己一直在做这样的事情:

    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?

4

6 回答 6

59

您还可以使用 android:onclick 属性在布局 xml 中设置它。

android:onClick="onClick"

然后在您的活动类中添加 onClick 方法。

public void onClick(View v) {
...

这是文档

于 2010-09-25T20:30:12.190 回答
35

让你的班级实现“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;
       ...
   }
}
于 2010-09-25T20:33:42.310 回答
5

刚@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
   }
};
于 2014-03-28T18:35:03.190 回答
4

应当指出的是

android:onclick="onClick"

至少需要 Andoid SDK 1.6。因此,如果您希望尽可能多的用户访问您的应用程序,您可能希望针对 Android 1.6 编写您的应用程序。除非您的应用程序需要仅在 1.6+ 中可用的功能。因此,虽然您的第一次尝试需要更多的工作,但它具有更大的向后兼容性。我通常按​​照您的方式进行操作,以保持我的 Apps 1.5 兼容。

编辑:如果您在项目设置中将 Android 2.2 设置为 SDK,但将 minSDK 版本设置为 3 (1.5),则很容易忽略这一点,因为它不会产生编译器错误。

于 2010-09-25T22:15:55.303 回答
1

我认为以防万一,当您的按钮不在 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);
}
于 2012-11-28T18:25:56.343 回答
0

如果你想为点击监听器做更少的代码,你有这个库 [ 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();
}
于 2018-02-02T18:32:35.383 回答