Android 监听事件功能,可以实现点击就会完成相应的功能。实现监听事件有4种方法:
方法一:通过内部类实现.
首先在btn1上用setOnClickListener()设置一个监听功能。这时需要传进去一个OnClickListener的对象进去。
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
而OnClickListener是一个接口:
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
因此需要在MainActivity里面创建一个类MyClickListener 实现OnClickListener的接口,然后将对象到 setOnClickListener中。
具体实现代码为:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyClickListener mcl = new MyClickListener();
Button btn1 = findViewById(R.id.btn1);
btn1.setOnClickListener(mcl);
}
class MyClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Log.e("Button1","通过内部类来实现按钮点击监听");
}
}
}
方法二:通过匿名内部类实现:
这个方法和方法一类似,区别在于方法一有明确的类名,而方法二是直接在setOnClickListener()的参数列表中new一个OnClickListener。
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Button2","通过匿名内部类来实现按钮点击监听");
}
});
方法三:通过当前的activity 类实现接口OnClickListener,并与button绑定。
从方法一种可以看出,实现的方法是新建一个类去实现OnClickListener接口,那么是不是可以在当前的activity类中去实现这个接口,这样就不需要再创建一个新类了。方法三就是这样实现的。由于是这个activity这个类上实现的接口,因此传入的是当前类的对象this。
public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.button_activity);
Button btn3= findViewById(R.id.btn3);
/*
* 方法3: 通过当前activity 实现OnClickListener接口,然后绑定到指定的button上,
* this表示当前类的实例化对象
*
* */
btn3.setOnClickListener(this);
@Override
public void onClick(View v) {
Log.e("Button3","通过当前activity来实现按钮点击监听");
}
}
方法四:通过xml布局文件的属性android:onClick来绑定一个onclick函数,当点击这个button的时候就会执行onclick函数。
这个方法是使用最多的方法。
实现步骤:
1. 在xml布局文件中增加 android:onClick属性
2.在activity中增加对应的函数myclick
public void myclick(View v){
Log.e("Button4","通过xml绑定点击事件");
}
这个方法是应用最多的方法,但是有一个缺点,如果一个acivity中有很多button,需要绑定很多的click函数,那么就需要创建非常多的click函数,增加了后期代码维护的难度,因此可以才用下面的方式,将所有的button点击事件放在一个click中处理。v.getId会获取点击button的标志位,返回一个int类型的整数。可以根据这个返回值和通过R.id获取到的标志位来比较,然后执行相应的操作。
public void myclick(View v){
switch(v.getId()){
case R.id.btn4 :
Log.e("Button4","通过xml文件绑定监听");
break;
case R.id.btn5:
Log.e("Button5","通过xml文件绑定监听");
break;
}
}
strings.xml
My Application
通过内部类来实现按钮点击监听
通过匿名内部类来实现按钮点击监听
通过当前activity来实现监听
通过xml绑定点击事件
最后是全部四种方法的具体代码实现:
button_activity.xml
ButtonActivity:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.button_activity);
MyClickListener mcl = new MyClickListener();
Button btn1 = findViewById(R.id.btn1);
btn1.setOnClickListener(mcl);
Button btn2 = findViewById(R.id.btn2);
Button btn3= findViewById(R.id.btn3);
Button btn4 = findViewById(R.id.btn4);
/*
* 方法3: 通过当前activity 实现OnClickListener接口,然后绑定到指定的button上,
* this表示当前类的实例化对象
*
* */
btn3.setOnClickListener(this);
/*方法2: 通过匿名内部类实现按钮点击监听,这个方法中 OnClickListener没有实现接口的类名,是通过new直接实现的
因此触发的事件只能和这个按钮绑定,不能复用。
*/
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Button2","通过匿名内部类来实现按钮点击监听");
}
});
}
@Override
public void onClick(View v) {
Log.e("Button3","通过当前activity来实现按钮点击监听");
}
//方法1:btn1是通过内部类来实现按钮监听功能
class MyClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Log.e("Button1","通过内部类来实现按钮点击监听");
}
}
/*方法4:通过xml文件中绑定按钮监听,
*多个按钮绑定的点击监听事件,可以通过一个click函数来实现
*/
public void myclick(View v){
switch(v.getId()){
case R.id.btn4 :
Log.e("Button4","通过xml文件绑定监听");
break;
case R.id.btn5:
Log.e("Button5","通过xml文件绑定监听");
break;
}
}
}