1、自定义内部类
2、匿名内部类
3、当前activity去实现事件接口
4、在布局文件xml中添加点击事件属性(使用频率非常高)
补充:
a、Android 在xml文件中 给某个控件声明 id 是: "@+/自定义名字" ,
获取是: "@/自定义的名字" , 例如: android:id="@id/btn1", 文本 android:text="@string/long_text" ,图片等。
b、安卓的View 的继承关系:
安卓的View继承关系.png
1、自定义内部类 MyClickListener
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1、获取按钮(自定义内部类)
Button btn = findViewById(R.id.btn1); // 通过 findViewById 去找索引
// 2、注册按钮
MyClickListener mclick1 = new MyClickListener();
btn.setOnClickListener(mclick1);
}
// 3、内部类 -- 点击事件触发
class MyClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Log.e("tag","点击了......");
}
}
xml文件
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按钮点击事件">
2、匿名内部类(就是 生成对象的时候才知道是什么类名)
做参数 传参的时候 new Xxxxclass 就是匿名对象了。
Button btn2 = findViewById(R.id.btn1);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Tag","通过匿名内部类实现按钮点击");
}
});
3、当前activity去实现事件接口
自己写个接口,根据1中的“自定义内部类” 思想,我们可以看到只要是一个类都是可以 执行(implements)一个接口。那么为何自己的类 使用不是更好吗?是的,开工,跟着我实现这个接口吧。
// implements View.OnClickListener 是自己添加的 要实现的接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 定义一个按钮
Button btn3 = findViewById(R.id.btn1);
btn3.setOnClickListener(this);// this 指当前类
}
@Override
public void onClick(View view) {
Log.e("TAG","使用本类实现了OnClickListener");
}
}
4、在布局文件xml中添加点击事件属性
xml文件是这样 --- 推荐给个ID
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="在xml文件中绑定事件"
android:onClick="myAction"/>
android:id="@+id/btn5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="在xml文件中绑定事件"
android:onClick="myAction"/>
//参数:被点击的控件对象 View
public void myAction(View v){
switch (v.getId()){
case R.id.btn4:
Log.e("TAG","通过xml绑定点击事件 btn4");
break;
case R.id.btn5:
Log.e("TAG","通过xml绑定点击事件 btn5");
break;
}
}
demo效果:
最后一种经常使用.jpeg
疑惑?
为什么click里边都是 onClick(View view),我点击的是Button呀!
答:上面给了个View的继承关系,button也是继承View的。因为点击事件并不仅仅Button才有事件,其它UI控件也要,所以使用View更加合适。
总结:
1、如果多个按钮(点击事件)的操作差不多就使用自定义,可以减少代码,更加简洁。
2、如果某个按钮的事件是唯一的,那么使用 匿名内部类吧。(没有绝对,只有更好)
3、xml中绑定事件 经常使用。