首先要明白监听有三要素
1. 事件源(Event Source)
2.事件(Event)
3.事件监听器(Event Listener)
首先上一个很常用的一个点击事件
这个里面是含有三要素的 只是点击事件是单一的事件 不是复杂的方法所以就将事件这个要素自动缩写了
上一个稍微复杂的触摸事件
这里就是典型的监听事件所包含的三要素
实现监听事件的方法
1.通过内部类实现
2.通过匿名内部类实现 (以上的呢两个例子就是通过这个方法实现的 也是最常使用的方法)
3.通过事件源所在的类实现
4.通过外部类实现
5.在布局文件中onClick属性(针对点击事件)
具体代码以及实现方式参考我的github
https://github.com/Leexzyy/TEST 其中的事件机制 Commits 这一段事件装修一下GItHub主页
给同一个事件源添加多个同种类型的监听器会怎样
(会执行最后一个监听事件)
1.通过内部类实现
直接上代码代码吧 先在xml中新建一个butten 用来实现onclick方法
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/btn_eve"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click Me"
android:textAllCaps="false"/>
</LinearLayout>
这个没啥解释的吧
然后在activity中通过内部类实现onClick方法
public class EventActivity extends AppCompatActivity {
private Button mBtnEve;
//当同一个事件源设置了多个监听器 系统只会执行最后一个监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
mBtnEve = findViewById(R.id.btn_eve);
// // 通过内部类实现事件
mBtnEve.setOnClickListener(new onClick());
}
//通过内部类实现事件
class onClick implements View.OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_eve:
ToastUtil.showMsg(EventActivity.this,"通过内部类实现事件。。。。");
break;
default:
}
}
}
PS:ToastUil是我自己做的一个工具类呗 主要是用来简写Toast 以及稍微简单的优化
2.通过匿名内部类实现
public class EventActivity extends AppCompatActivity {
private Button mBtnEve;
//当同一个事件源设置了多个监听器 系统只会执行最后一个监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
mBtnEve = findViewById(R.id.btn_eve);
// // 通过内部类实现事件
// mBtnEve.setOnClickListener(new onClick());
// //匿名内部类
mBtnEve.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtil.showMsg(EventActivity.this,"通过匿名内部类实现事件。。。。");
}
});
}
//通过内部类实现事件
class onClick implements View.OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_eve:
ToastUtil.showMsg(EventActivity.this,"通过内部类实现事件。。。。");
break;
default:
}
}
}
这个就比较 简单了 因为是比较常用的方法
3.通过事件源所在的类实现
为了代码的简单以及易读 我就将以上的代码不贴出来了 直接上这个方法的代码 用来好理解
public class EventActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtnEve;
//当同一个事件源设置了多个监听器 系统只会执行最后一个监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
mBtnEve = findViewById(R.id.btn_eve);
// 通过事件源所在的类实现
mBtnEve.setOnClickListener(EventActivity.this);
}
//通过事件源所在的类实现
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_eve:
ToastUtil.showMsg(EventActivity.this,"通过activity实现事件(通过事件源所在的类实现)");
break;
default:
}
}
}
首先需要讲的就是需要在这个Activity里面去实现View.OnClickListener这个接口 然后实现onClick方法
4.通过外部类实现
首先得要去写一个外部类呀 不然怎么到外部类中实现方法呢
先新建一个class 我的是MyClickListener.java
public class MyClickListener implements View.OnClickListener {
private Activity mActivity;
//构造方法 这个是传入Activity 可以增加其他的 比如文字或者输入框
public MyClickListener(Activity activity){
this.mActivity = activity;
}
@Override
public void onClick(View v) {
ToastUtil.showMsg(mActivity,"通过外部类实现click....");
}
}
然后再回到Activity
public class EventActivity extends AppCompatActivity {
private Button mBtnEve;
//当同一个事件源设置了多个监听器 系统只会执行最后一个监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
mBtnEve = findViewById(R.id.btn_eve);
// 通过外部类去实现
mBtnEve.setOnClickListener(new MyClickListener(EventActivity.this));
}
这是最简答的写法
外部类是比较不常用的一种方式
5 在布局文件中还有onClick 这个属性
先在xml中增加这个属性
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/btn_eve"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click Me"
android:textAllCaps="false"
android:onClick="show"/>
</LinearLayout>
然后再在Activity中增加show方法(这个要和xml属性一致)
public class EventActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtnEve;
//当同一个事件源设置了多个监听器 系统只会执行最后一个监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
mBtnEve = findViewById(R.id.btn_eve);
}
//通过控件的onClick属性实现onClick事件
public void show(View v){
switch (v.getId()){
case R.id.btn_event:
ToastUtil.showMsg(EventActivity.this,"通过内部类实现事件。。。。");
break;
default:
}
}
}
大致的基于监听事件的事件处理机制以及实现监听事件的方法就差不多这些了
差不多自己写一份代码然后再发表到博客上会对与自己来说更加巩固更加理解这些基础知识 还有想说的就是当在用switch方法时最好在后面加default: 这个是代码规范问题 这个我是在阿里巴巴的代码规范插件上学到的知识 具体的用法和作用可以参考一下 我写过的用法 switch中的default 点击蓝字自动跳转过去