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; } }
Switch
– case
比if
更容易维护,而且这个实现不需要创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(); } }
检查这篇文章的更多细节