如何处理多个按钮和OnClickListeners

7

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

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

我的想法是,对于每个按钮使用onClick()方法,但这种方法不太实用,因为我需要为每个按钮编写16个onClick()方法。

是否有更优雅的方式?


可能是重复的问题,参见 https://dev59.com/FW865IYBdhLWcg3wd-ge - Vivart
6个回答

19

你可以将它们全部处理在一个实现了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)意外停止。请再试一次。”问题可能出在哪里?是否存在用于日志故障或类似内容的文件? - user1946705

6
您可以使用一个不定义为匿名内部类的处理程序,而是在单独的类中定义。 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"

4
当然。创建一个你的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
}

2
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...
    }
}

2

您不需要在每个按钮上都写16个点击监听器。只需创建一个并将其附加到每个按钮上即可。onClick()方法会接收一个View参数,这个View就是您的按钮。只需检查它的id或名称即可。


0

我通常会这样做:

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

        }
}

如果你有很多按钮并且想要为它们使用相同的监听器,那么这非常方便。祝好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接