Saya memiliki aktivitas:
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!!!
}
}
}
Bagaimana cara memeriksa tombol mana yang telah diklik?
Jawaban:
Anda akan mempelajari cara melakukannya, dengan cara yang mudah, adalah:
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 } }; }
Atau, jika Anda bekerja hanya dengan satu pendengar klik, Anda dapat melakukan:
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; } } }
Padahal, saya tidak menyarankan melakukannya dengan cara itu karena Anda harus menambahkan
if
untuk setiap tombol yang Anda gunakan. Itu sulit untuk dipertahankan.sumber
View
bukan aButton
, tapiButton
aView
. Padahal, Anda dapat mentransmisikanView
keButton
. Perlu diingat bahwa cara kedua untuk melakukannya tidak disarankan ... mungkin v mungkin bukan Tombol, yang akan menghasilkan pengecualian cast.Atau Anda dapat mencoba hal yang sama tetapi tanpa pendengar. Pada definisi XML tombol Anda:
android:onClick="ButtonOnClick"
Dan dalam kode Anda tentukan metode
ButtonOnClick
:public void ButtonOnClick(View v) { switch (v.getId()) { case R.id.button1: doSomething1(); break; case R.id.button2: doSomething2(); break; } }
sumber
if
pernyataan, dan pendengar. Pendengar bagus jika tombol dibuat saat runtime, tetapi seringkali tidak demikian.Fragment
s, karena callback harus berada dalam aktivitas (bukan fragmen).Aku lebih memilih:
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); ... }
Lalu:
@Override public void onClick(View v) { switch (v.getId()) { case R.id.b1: .... break; case R.id.b2: .... break; } }
Switch
-case
lebih mudah dipelihara daripadaif
-else
, dan implementasi ini tidak memerlukan pembuatan banyak variabel kelas.sumber
Lima Cara untuk Mempersiapkan Pemroses Acara adalah artikel bagus yang menjelaskan berbagai cara untuk menyiapkan pendengar acara tunggal. Izinkan saya mengembangkannya di sini untuk banyak pendengar.
1. Kelas Anggota
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. Jenis Antarmuka
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. Kelas Batin Anonim
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. Implementasi dalam Aktivitas
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. Atribut dalam Tata Letak Tampilan untuk Acara 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; } } }
Dan dalam 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" />
sumber
Jika Anda tidak ingin menyimpan contoh tombol 2 di kode kelas, ikuti cara LEBIH BAIK ini (ini lebih jelas dan cepat !!):
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; } }
sumber
Cara lain untuk melakukannya adalah pendengar tunggal dari aktivitas, seperti ini:
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; } } }
Saya suka melakukannya dengan satu IF daripada dengan switch-else, tetapi jika Anda lebih suka itu, Anda harus melakukan:
//my listener @Override public void onClick(View v) { switch(v.getId()) { case R.id.mybutton: { DoSomething(); break; } case R.id.mybutton2: { DoSomething(); break; } } }
sumber
Cara terbaik adalah dengan
switch
-ing antara v.getId (). Memiliki OnClickListener anonim yang terpisah untuk setiap Tombol menggunakan lebih banyak memori. Mentransmisikan Tampilan ke Tombol tidak diperlukan. Menggunakan if-else saat pengalih dimungkinkan lebih lambat dan lebih sulit untuk dibaca. Di sumber Android, Anda sering kali dapat melihat perbandingan referensi dengan if-else:if (b1 == v) { // ... } else if (b2 == v) {
Saya tidak tahu persis mengapa mereka memilih cara ini, tetapi berhasil juga.
sumber
gunakan setTag ();
seperti ini:
@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; } }
sumber
Selain jawaban Cristian C (maaf, saya tidak memiliki kemampuan untuk memberikan komentar), jika Anda membuat satu penangan untuk kedua tombol, Anda dapat langsung membandingkan v dengan b1 dan b2, atau jika Anda ingin membandingkan dengan ID, Anda tidak perlu mentransmisikan v ke Button (View memiliki metode getId (), juga), dan dengan demikian tidak perlu khawatir akan pengecualian cast.
sumber
Button mybutton = new Button(ViewPagerSample.this); mybutton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } });
sumber
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(); } }
Lihat artikel ini untuk lebih jelasnya
sumber