【问题标题】:How to go about multiple Buttons and OnClickListeners如何处理多个按钮和 OnClickListeners
【发布时间】:2011-04-13 08:29:57
【问题描述】:

我的布局 XML 文件中有 16 个Buttons(数字、加号、减号等)。

我想知道如何检查按下了哪个按钮。

我的想法是,我将为每个按钮使用 onClick() 方法,但这种方法有点不切实际,因为我将为每个按钮使用 16 个 onClick() 方法。

有没有更优雅的方式?

【问题讨论】:

标签: android button


【解决方案1】:

您可以在实现 OnClickListener 的单个类中处理它们,如果您愿意,也可以在活动类中处理它们......

import android.view.View.OnClickListener;

   public class MyActivity extends Activity implements OnClickListener {

      @Override public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         Button buttonA = (Button) findViewById(R.id.buttonA);    
         buttonA.setOnClickListener(this);
         Button buttonB = (Button) findViewById(R.id.buttonB); 
         buttonB.setOnClickListener(this);
      }

   //etc... etc...

   public void onClick(View v) {

      switch (v.getId()) {
         case R.id.buttonA: 
          // do something
          break;
         case R.id.buttonB:
          // do something else
          break;
      }
   }

}

【讨论】:

  • 感谢您的提示,伙计们。我尝试如何显示@user433579,但在模拟器中运行我的应用程序后仍然出现错误“抱歉!-此应用程序 CALC(进程 com.tsk.calc)已意外停止。请再试一次。”哪里可能有问题?是否存在日志错误或类似的文件?
【解决方案2】:

您可以使用一个不定义为匿名内部类的处理程序,而是在一个单独的类中。 onClick() 会获取传入的视图,你可以从中选择。

public class MyActivity implements OnClickListener {
    public void onClick(View v) {
       Button b = (Button)v;
       // do what you want 
    }

    ...
}

然后在你的 layout.xml 中为每个按钮添加

<Button android:id=".."
        android:onClick="onClick"

【讨论】:

    【解决方案3】:

    当然。创建一个 button-ids 数组,并在循环中为它们分配相同的侦听器(View.OnClickListener 的实现 - 定义为单独的类,而不是匿名类)。在监听器中,您可以检查哪个是按下的按钮(通过比较 onClick() 方法中的 view 参数)。

    活动中:

    MyOnClickListener myListener = new MyOnClickListener();
    for (int id : buttonIdArray)
        ((Button)findViewById(id)).setOnClickListener(myListener);
    

    在onClick方法中:

    int id = view.getId();
    switch (id)
    {
    case ...:
    // Do stuff
    case ...:
    // Do different stuff
    }
    

    【讨论】:

      【解决方案4】:

      您不必在点击侦听器中提及 16。创建一个并将其附加到每个按钮。 onClick() 方法获取一个视图作为参数。此视图是您的按钮。只需检查它的 ID 或名称即可。

      【讨论】:

        【解决方案5】:
        import android.view.View.OnClickListener;
        
        public class MyActivity extends Activity implements OnClickListener {
        
          @Override public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main);
             Button buttonA = (Button) findViewById(R.id.buttonA);    
             Button buttonB = (Button) findViewById(R.id.buttonB); 
             buttonA.setOnClickListener(this);
             buttonB.setOnClickListener(this);
          }
        
          public void onClick(View v) {
            if(v==buttonA)
            {
                do something...
            }
            if(v==buttonB)
            {
                do something...
            }
        }
        

        【讨论】:

          【解决方案6】:

          我通常会这样做:

          @Override
          public boolean onTouch(View v, MotionEvent event) 
          {
              Button thisButton = (Button) v;
          
          
              switch (event.ACTION_DOWN)
              {
                  case MotionEvent.ACTION_DOWN:
                      for (int i = 0; i < _button.length;i++)
          
                          if (tagOf(thisButton) == tagOf(_button[i]))
                          {
                              System.out.println("Button " + i + " pressed!");
                              _textView[i].setText(String.valueOf(_settingBrowser.countUpPosition(i)));
                          }
              }
              return false;
          }
          
          
          int tagOf (Button b)
          {
              return Integer.parseInt(b.getTag().toString());
          }
          

          在主类中使用 ID 号启动按钮,如下所示:

          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
          
              _button = new Button[FIELDS];
          
          
                  _button[0] = (Button) findViewById(R.id.Button01);
                  _button[1] = (Button) findViewById(R.id.Button02);
                  _button[2] = (Button) findViewById(R.id.Button03);
                  _button[3] = (Button) findViewById(R.id.Button04);
                  _button[4] = (Button) findViewById(R.id.Button05);
                  _button[5] = (Button) findViewById(R.id.Button06);
          
          
                  _padListener = new SettingButtonListener(_button); 
          
                  for (int j = 0; j < _button.length; j++){
                      _button[j].setTag(j);
                      _button[j].setOnTouchListener(_padListener);
          
                  }
          }
          

          如果您有大量的按钮,并且想要为所有按钮使用相同的侦听器,那么这很简洁。 干杯!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-01-29
            • 1970-01-01
            • 1970-01-01
            • 2023-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多