Android Studio 有关 setOnClickListener() 方法的总结
•前言
在 Android Studio 开发中,你会经常和这种代码打交道:
1 package com.example.activitytest; 2 public class FirstActivity extends AppCompatActivity { 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.first_layout);//给当前的活动加载一个布局 9 Button btn1 = findViewById(R.id.btn_1); 10 11 btn1.setOnClickListener(new View.OnClickListener(){ 12 public void onClick(View v){ 13 14 }); 15 } 16 }那么,setOnClickListener() 方法起到什么作用呢?
在本次代码中,setOnClickListener() 方法为按钮注册一个监听器,点击按钮时就会执行监听器中的 onClick() 方法。
onClicklistener是一个接口,不能实例化,这就是一个匿名内部类。
•两种方式实现点击事件
用匿名类来实现点击事件
用外部类来实现点击事件
•Code
.java 代码:
1 package com.example.activitytest; 2 3 import android.os.Bundle; 4 import android.view.View; 5 import android.widget.Button; 6 import android.widget.Toast; 7 8 import androidx.appcompat.app.AppCompatActivity; 9 10 public class FirstActivity extends AppCompatActivity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.first_layout);//给当前的活动加载一个布局 17 18 Button btn1 = findViewById(R.id.btn_1); 19 Button btn2 = findViewById(R.id.btn_2); 20 21 //用匿名类来实现点击事件的方法 22 btn1.setOnClickListener(new View.OnClickListener(){ 23 public void onClick(View v){ 24 Toast.makeText(FirstActivity.this,"用匿名类来实现点击事件",Toast.LENGTH_SHORT).show(); 25 } 26 }); 27 28 btn2.setOnClickListener(new MyClick()); 29 } 30 //用外部类来实现点击事件的代码如下 31 class MyClick implements View.OnClickListener{ 32 33 @Override 34 public void onClick(View v) { 35 Toast t = Toast.makeText(FirstActivity.this,"用外部类来实现点击事件",Toast.LENGTH_SHORT); 36 t.show(); 37 } 38 } 39 }.xml 代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:padding="10dp"> 7 8 <Button 9 android:id="@+id/btn_1" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:layout_marginTop="10dp" 13 android:background="#33CCCC" 14 android:text="Button_1" /> 15 16 <Button 17 android:id="@+id/btn_2" 18 android:layout_width="match_parent" 19 android:layout_height="wrap_content" 20 android:background="#D54D2B" 21 android:layout_marginTop="10dp" 22 android:text="Button_2" 23 /> 24 </LinearLayout>
•运行效果
•精简代码
分下如下代码:
1 package com.example.helloworld; 2 3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Button; 7 8 import androidx.appcompat.app.AppCompatActivity; 9 10 public class MainActivity extends AppCompatActivity { 11 12 private Button mBtn1; 13 private Button mBtn2; 14 private Button mBtn3; 15 private Button mBtn4; 16 private Button mBtn5; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 mBtn1 = findViewById(R.id.btn_1); 24 25 mBtn1.setOnClickListener(new View.OnClickListener(){ 26 public void onClick(View v){ 27 //跳转到 TextView 演示界面 28 Intent intent = new Intent(MainActivity.this, TextViewActivity.class); 29 startActivity(intent); 30 } 31 }); 32 33 mBtn2 = findViewById(R.id.btn_2); 34 mBtn2.setOnClickListener(new View.OnClickListener() { 35 @Override 36 public void onClick(View v) { 37 Intent intent = new Intent(MainActivity.this,QQ.class); 38 startActivity(intent); 39 } 40 }); 41 42 mBtn3 = findViewById(R.id.btn_3); 43 mBtn3.setOnClickListener(new View.OnClickListener() { 44 @Override 45 public void onClick(View v) { 46 Intent intent = new Intent(MainActivity.this,ButtonActivity.class); 47 startActivity(intent); 48 } 49 }); 50 51 mBtn4 = findViewById(R.id.btn_4); 52 mBtn4.setOnClickListener(new View.OnClickListener() { 53 @Override 54 public void onClick(View v) { 55 Intent intent = new Intent(MainActivity.this,IntentActivity.class); 56 startActivity(intent); 57 } 58 }); 59 60 mBtn5 = findViewById(R.id.btn_5); 61 mBtn5.setOnClickListener(new View.OnClickListener() { 62 @Override 63 public void onClick(View v) { 64 Intent intent = new Intent(MainActivity.this,EditTextActivity.class); 65 startActivity(intent); 66 } 67 }); 68 } 69 }五个 Button 变量,每个变量调用了 setOnClickListener() 方法。
每次调用都重写一遍 setOnClickListener() 方法,是不是看上去略微臃肿了一些?
怎样才能给这段代码减减肥呢?
答案是用外部类来实现点击事件;
精简后的代码如下:
1 package com.example.helloworld; 2 3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Button; 7 8 import androidx.appcompat.app.AppCompatActivity; 9 10 public class MainActivity extends AppCompatActivity { 11 12 private Button mBtn1; 13 private Button mBtn2; 14 private Button mBtn3; 15 private Button mBtn4; 16 private Button mBtn5; 17 private Button mBtn6; 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 mBtn1 = findViewById(R.id.btn_1); 24 mBtn1.setOnClickListener(new MyClick()); 25 26 mBtn2 = findViewById(R.id.btn_2); 27 mBtn2.setOnClickListener(new MyClick()); 28 29 mBtn3 = findViewById(R.id.btn_3); 30 mBtn3.setOnClickListener(new MyClick()); 31 32 mBtn4 = findViewById(R.id.btn_4); 33 mBtn4.setOnClickListener(new MyClick()); 34 35 mBtn5 = findViewById(R.id.btn_5); 36 mBtn5.setOnClickListener(new MyClick()); 37 38 mBtn6 = findViewById(R.id.btn_6); 39 mBtn6.setOnClickListener(new MyClick()); 40 41 } 42 private class MyClick implements View.OnClickListener{ 43 44 public void onClick(View v){ 45 Intent intent = null; 46 switch(v.getId()){ 47 case R.id.btn_1: 48 //填入对应的事件 49 intent = new Intent(MainActivity.this, TextViewActivity.class); 50 break; 51 case R.id.btn_2: 52 //填入对应的事件 53 intent = new Intent(MainActivity.this,QQ.class); 54 break; 55 case R.id.btn_3: 56 //填入对应的事件 57 intent = new Intent(MainActivity.this,ButtonActivity.class); 58 break; 59 case R.id.btn_4: 60 //填入对应的事件 61 intent = new Intent(MainActivity.this,IntentActivity.class); 62 break; 63 case R.id.btn_5: 64 //填入对应的事件 65 intent = new Intent(MainActivity.this,EditTextActivity.class); 66 break; 67 case R.id.btn_6: 68 //填入对应的事件 69 intent = new Intent(MainActivity.this,RedioButtonActivity.class); 70 break; 71 } 72 startActivity(intent); 73 } 74 } 75 }这么写,看着是不是舒服多了。