【前言】
按鈕少的時候用第三種的匿名內部類會比較快,比如寫demo測試的時候或者登陸界面之類。
按鈕多的時候一般選擇第四種寫法。
一、第一種寫法:在XML文件中聲明onClick屬性(很少用)
在XML文件中顯式指定控件的onClick屬性,點擊按鈕時會利用反射的方式調用對應Activity中的onClick()方法。
(1)xml文件代碼如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <Button 8 android:id="@+id/btn1" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:onClick="onClick" 12 android:text="按鈕1" /> 13 14 <Button 15 android:id="@+id/btn2" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:onClick="onClick" 19 android:text="按鈕2" /> 20 21 </LinearLayout>
上面的代碼中,我們在第11行、18行指定了onClick屬性,然后接下來在Activity中寫一個onClick同名方法。
(2)MainActivity.java:
1 package com.vae01; 2 3 import android.app.Activity; 4 import android.content.DialogInterface.OnClickListener; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 import android.widget.ImageView; 9 import android.widget.TextView; 10 import android.widget.Toast; 11 12 public class MainActivity extends Activity { 13 14 private Button btn1, btn2; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 initView(); 21 } 22 23 // 方法:初始化View 24 private void initView() { 25 btn1 = (Button) findViewById(R.id.btn1); 26 btn2 = (Button) findViewById(R.id.btn2); 27 } 28 29 //方法:控件View的點擊事件 30 public void onClick(View v) { 31 switch (v.getId()) { 32 case R.id.btn1: 33 Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show(); 34 break; 35 case R.id.btn2: 36 Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show(); 37 break; 38 39 default: 40 break; 41 } 42 } 43 }
注意,第30行的onClick()方法的權限是public,畢竟xml文件還要訪問的嘛。
二、第二種寫法:使用內部類(很少用)
(1)xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕1" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕2" /> </LinearLayout>
(2)MainActivity.java:
1 package com.vae01; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.ImageView; 9 import android.widget.TextView; 10 import android.widget.Toast; 11 12 public class MainActivity extends Activity { 13 14 private Button btn1, btn2; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 initView(); 21 } 22 23 // 方法:初始化View 24 private void initView() { 25 btn1 = (Button) findViewById(R.id.btn1); 26 btn2 = (Button) findViewById(R.id.btn2); 27 28 btn1.setOnClickListener(new MyClickListener()); 29 btn2.setOnClickListener(new MyClickListener()); 30 } 31 32 class MyClickListener implements OnClickListener { 33 @Override 34 public void onClick(View v) { 35 switch (v.getId()) { 36 case R.id.btn1: 37 Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show(); 38 break; 39 case R.id.btn2: 40 Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show(); 41 break; 42 default: 43 break; 44 } 45 } 46 } 47 }
注意第28、29行:不要忘記了綁定監聽器。
三、第三種寫法:匿名內部類(適合場景:測試、或者只有單個button的時候。使用較多)
(1)xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕1" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕2" /> </LinearLayout>
(2)MainActivity.java:
1 package com.vae01; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.Toast; 9 10 public class MainActivity extends Activity { 11 12 private Button btn1, btn2; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 initView(); 19 } 20 21 // 方法:初始化View 22 private void initView() { 23 btn1 = (Button) findViewById(R.id.btn1); 24 btn2 = (Button) findViewById(R.id.btn2); 25 26 btn1.setOnClickListener(new OnClickListener(){ 27 @Override 28 public void onClick(View v) { 29 Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show(); 30 } 31 32 }); 33 34 btn2.setOnClickListener(new OnClickListener(){ 35 @Override 36 public void onClick(View v) { 37 Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show(); 38 } 39 40 }); 41 } 42 }
四、第四種寫法:Activity實現View.OnClickListener接口(最常用)
Activity繼承View.OnClickListener,由Activity實現OnClick(View view)方法,在OnClick(View view)方法中用switch-case對不同id代表的button進行相應的處理
(1)xml代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕1" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕2" /> </LinearLayout>
(2)MainActivity.java:
1 package com.vae01; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.Toast; 9 10 public class MainActivity extends Activity implements OnClickListener{ 11 12 private Button btn1, btn2; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 //初始化View 19 initView(); 20 } 21 22 // 方法:初始化View 23 private void initView() { 24 btn1 = (Button) findViewById(R.id.btn1); 25 btn2 = (Button) findViewById(R.id.btn2); 26 27 //按鈕綁定點擊事件的監聽器 28 btn1.setOnClickListener(this); 29 btn2.setOnClickListener(this); 30 } 31 32 //方法:按鈕的單擊事件 33 @Override 34 public void onClick(View v) { 35 switch (v.getId()) { 36 case R.id.btn1: 37 Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show(); 38 break; 39 case R.id.btn2: 40 Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show(); 41 break; 42 default: 43 break; 44 } 45 } 46 }