Android OnClickListener – идентифицировать кнопку

Привет. У меня есть активность:

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

Как проверить, какая кнопка была нажата?

Solutions Collecting From Web of "Android OnClickListener – идентифицировать кнопку"

Вы узнаете, как это сделать, простым способом:

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

Или, если вы работаете с одним кликом, вы можете:

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

Хотя, я не рекомендую делать это так, потому что вам нужно будет добавить if для каждой используемой вами кнопки. Это трудно поддерживать.

Или вы можете попробовать то же самое, но без слушателей. На вашей кнопке определение XML:

 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 else , и эта реализация не требует создания многих переменных класса.

Если вы не хотите сохранять экземпляры кнопки 2 в коде класса, следуйте этому методу BETTER (это более понятно и быстро!):

 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. Тип интерфейса

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

Лучший способ – switch между v.getId (). Наличие отдельного анонимного OnClickListener для каждой кнопки занимает больше памяти. Кастинг View to Button не нужен. Использование if-else при возможности переключения медленнее и труднее читать. В исходном коде Android вы можете заметить сравнение ссылок с помощью if-else:

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

Я не знаю точно, почему они выбрали этот путь, но он тоже работает.

Использовать 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 (извините, у меня нет возможности комментировать), если вы делаете один обработчик для обеих кнопок, вы можете напрямую сравнить v с b1 и b2, или если вы хотите сравнить по ID, вы Вам не нужно бросать v в Button (View также имеет метод getId ()), и таким образом нет беспокойства по поводу исключения исключения.

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

Проверьте эту статью для получения более подробной информации.