【问题标题】:One OnClickHandler for multiple Buttons一个 OnClickHandler 用于多个按钮
【发布时间】:2011-04-17 06:19:07
【问题描述】:

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

    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?

【问题讨论】:

    标签: android button clicklistener


    【解决方案1】:

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

    android:onClick="onClick"
    

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

    public void onClick(View v) {
    ...
    

    这是documentation

    【讨论】:

    • 啊,不错 :) 简短而有效。我喜欢!
    • 如果按钮是动态创建的呢?
    • @Orion 这种方法和 mseo 的方法都适用于动态创建的按钮。
    【解决方案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】:

    需要注意的是,

    android:onclick="onClick"
    

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

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

    【讨论】:

      【解决方案4】:

      我认为,如果您的按钮不在 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);
      }
      

      【讨论】:

        【解决方案5】:

        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
           }
        };
        

        【讨论】:

          【解决方案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();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多