2011-04-13 60 views
7

我在我的布局XML文件中有16 Button s(数字,加号,减号等)。如何去多个按钮和OnClickListeners

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

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

有没有更优雅的方式?

+0

http://stackoverflow.com/questions/3795439/one-onclickhandler-for-multiple-buttons – Vivart 2011-04-13 08:38:45

回答

2

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

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

} 
+0

感谢您的提示,伙计们。 我试图做如何显示@ user433579,但我仍然在仿真器错误运行我的应用程序后“对不起! - 此应用程序CALC(进程com.tsk.calc)意外停止,请再试一次。 哪里有问题?存在日志错误或类似的文件? – user1946705 2011-04-13 10:31:07

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

     } 
} 

这是整齐的,如果你有像你这样的按钮一个大数目做并想要为它们使用相同的侦听器。 干杯!