Android OnClickListener – 识别一个button

嘿。 我有这样的活动:

public class Mtest extends Activity { Button b1; Button b2; public void onCreate(Bundle savedInstanceState) { ... b1 = (Button) findViewById(R.id.b1); b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(myhandler); b2.setOnClickListener(myhandler); ... } View.OnClickListener myhandler = new View.OnClickListener() { public void onClick(View v) { // MY QUESTION STARTS HERE!!! // IF b1 do this // IF b2 do this // MY QUESTION ENDS HERE!!! } } } 

如何检查哪个button被点击?

你将学会如何做到这一点,简单来说就是:

 public class Mtest extends Activity { Button b1; Button b2; public void onCreate(Bundle savedInstanceState) { ... b1 = (Button) findViewById(R.id.b1); b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(myhandler1); b2.setOnClickListener(myhandler2); ... } View.OnClickListener myhandler1 = new View.OnClickListener() { public void onClick(View v) { // it was the 1st button } }; View.OnClickListener myhandler2 = new View.OnClickListener() { public void onClick(View v) { // it was the 2nd button } }; } 

或者,如果您只使用一个clicklistener,您可以执行以下操作:

 View.OnClickListener myOnlyhandler = new View.OnClickListener() { public void onClick(View v) { switch(v.getId()) { case R.id.b1: // it was the first button break; case R.id.b2: // it was the second button break; } } } 

虽然,我不build议这样做,因为您将不得不为每个button添加if 。 这很难保持。

或者你可以尝试一样,但没有听众。 在你的buttonXML定义上:

 android:onClick="ButtonOnClick" 

并在您的代码中定义方法ButtonOnClick

 public void ButtonOnClick(View v) { switch (v.getId()) { case R.id.button1: doSomething1(); break; case R.id.button2: doSomething2(); break; } } 

我更喜欢:

 class MTest extends Activity implements OnClickListener { public void onCreate(Bundle savedInstanceState) { ... Button b1 = (Button) findViewById(R.id.b1); Button b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(this); b2.setOnClickListener(this); ... } 

接着:

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.b1: .... break; case R.id.b2: .... break; } } 

Switchcaseif更容易维护,而且这个实现不需要创build许多类variables。

如果您不想在类代码中保存2button的实例,请按照下面这个更好的方法(这个更清晰快捷!!):

 public void buttonPress(View v) { switch (v.getId()) { case R.id.button_one: // do something break; case R.id.button_two: // do something else break; case R.id.button_three: // i'm lazy, do nothing break; } } 

五种方法来连接事件监听器是一个伟大的文章,概述了设置单个事件监听器的各种方法。 让我在这里扩展多个听众。

1.会员类别

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //attach an instance of HandleClick to the Button HandleClick handleClick = new HandleClick(); findViewById(R.id.button1).setOnClickListener(handleClick); findViewById(R.id.button2).setOnClickListener(handleClick); } private class HandleClick implements OnClickListener{ public void onClick(View view) { switch(view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } } } 

2.接口types

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(handleClick); findViewById(R.id.button2).setOnClickListener(handleClick); } private OnClickListener handleClick = new OnClickListener() { public void onClick(View view) { switch (view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } }; } 

3.匿名内部类

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { public void onClick(View view) { // do stuff } }); findViewById(R.id.button2).setOnClickListener(new OnClickListener() { public void onClick(View view) { // do stuff } }); } } 

4.活动中的实施

 public class main extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); } public void onClick(View view) { switch (view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } } 

5. OnClick事件的视图布局中的属性

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void HandleClick(View view) { switch (view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } } 

而在xml中:

 <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="HandleClick" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="HandleClick" /> 

另一种做法是从活动中单独监听,如下所示:

 public class MyActivity extends Activity implements OnClickListener { ....... code //my listener @Override public void onClick(View v) { if (v.getId() == R.id.mybutton) { DoSomething(); return; } if (v.getId() == R.id.mybutton2) { DoSomething2(); return; } } } 

我喜欢用单一IF来代替switch-else,但是如果你喜欢,那么你应该这样做:

 //my listener @Override public void onClick(View v) { switch(v.getId()) { case R.id.mybutton: { DoSomething(); break; } case R.id.mybutton2: { DoSomething(); break; } } } 

最好的方法是通过在v.getId()之间switch 。 为每个button分开匿名的OnClickListener将占用更多的内存。 将button投射到button是不必要的。 当开关可能时使用if-else更慢,更难以阅读。 在Android的源代码中,通常可以注意到通过if-else来比较引用:

 if (b1 == v) { // ... } else if (b2 == v) { 

我不知道他们为什么select这种方式,但它也起作用。

使用setTag();

喜欢这个:

 @Override public void onClick(View v) { int tag = (Integer) v.getTag(); switch (tag) { case 1: System.out.println("button1 click"); break; case 2: System.out.println("button2 click"); break; } } 

除了Cristian C的回答(对不起,我没有能力发表评论),如果你为这两个button做一个处理程序,你可以直接比较v和b1和b2,或者如果你想用ID比较,也不需要把v转换成Button(View也有getId()方法),这样就不用担心抛出exception了。

 Button mybutton = new Button(ViewPagerSample.this); mybutton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); 
 Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(this); @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.getId() == R.id.button1){ Toast.makeText(context, "Button 1 Click", Toast.LENGTH_LONG).show(); } } 

检查这篇文章的更多细节