Android基于监听的种事件处理机制
作用:当用户在应用界面上执行各种操作时,应用程序需要为用户的动作提供响应,这种响应的过程就是事件处理。
监听的三要素
- 事件(Event)
- 事件源(Event Source)
- 事件监听器(Event Listener)
事件监听器的本质:实现了一个特定接口发的java对象
实现事件监听器的四种方式
1.Activity本身作为事件监听器:通过Activity实现监听器接口,并实现事件处理方法。
2.匿名内部类形式:使用匿名内部类创建监听器对象。
3.内部类或外部类形式:将事件监听类定义为当前类的内部类或普通的类
4.绑定标签:在布局文件种为指定标签绑定事件处理方法
Activity本身作为事件监听器代码
- 创建事件监听器event_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<EditText
android:id="@+id/showTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"/>
<!-- android:editable="false":不可编辑的-->
<Button
android:id="@+id/clickBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单击我"/>
</LinearLayout>
- 实现事件监听的接口EventBtnActivity.java
public class EventBtnActivity extends AppCompatActivity
implements View.OnClickListener {
//单击按钮
private Button clickBtn;
//文字显示
private TextView showTxt;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.event_btn);
//初始化组件
clickBtn = (Button)findViewById(R.id.clickBtn);
showTxt = (TextView)findViewById(R.id.showTxt);
//直接使用Activity作为事件监听器
clickBtn.setOnClickListener(this);
}
//在事件处理方法中编写事件处理代码
@Override
public void onClick(View v) {
//实现事件处理方法
showTxt.setText("BTN被Activtity单击了!!!");
}
}
- 效果如图所示:
缺点:Activity的职责主要是完成界面的初始化工作,在里面实现监听器,容易造成程序的结构混 乱,大多数事件监听只是临时使用一次,所以匿名内部类更为合适
匿名内部类形式
- 这里的事件监听器还是上面的event_btn.xml,不再次赘述
- 匿名内部类AnonymousBtnActivity.java
`public class AnoymousBtnActivity extends AppCompatActivity {
//单击Button
private Button clickBtn;
//文字显示
private TextView showTxt;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_btn);
//初始化组件
showTxt = (TextView)findViewById(R.id.showTxt);
clickBtn = (Button)findViewById(R.id.clickBtn);
//使用匿名内部类
clickBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//实现事件处理方法
showTxt.setText("btn按钮匿名内部类单击了!!!");
}
});
}
}
`
- 效果:
内部类,外部类形式
- 这里的事件监听器还是上面的event_btn.xml,不再次赘述
- 内部类InnerClassBtnActivity.java
public class InnerClassBtnActivity extends AppCompatActivity {
//单击按钮
private Button clickBtn;
//显示文字
private TextView showTxt;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_btn);
//初始化组件
clickBtn = (Button)findViewById(R.id.clickBtn);
showTxt = (TextView)findViewById(R.id.showTxt);
//直接使用Activity作为事件监听器
clickBtn.setOnClickListener(new ClickListener());
}
//内部类方式定义一个事件监听器
class ClickListener implements View.OnClickListener{
@Override
public void onClick(View view) {
//实现事件处理方法
showTxt.setText("btn按钮内部类");
}
}
}
-
优点:
1、可以在当前类中复用内部监听器类
2、由于监听器是当前类的内部类,所以可以访问当前类的所有界面组件 -
效果:
绑定标签:
Android的绑定标签,在界面布局文件中直接为指定绑定时间的处理放法。对于大多数Android界面的组件而言,基本都支持onClick事件的属性,相应的属性就是一个在。java文件中定义的一个事件处理方法
- event_tag.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<EditText
android:id="@+id/showTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false" />
<Button
android:id="@+id/clickBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
***android:onClick="clickMe"***
android:text="单击我"/>
</LinearLayout>
- BindTagActivity.java:事件处理方法
public class event_tagActivity extends AppCompatActivity {
//单击Button
private Button clickBtn;
//显示文本
private TextView showTxt;
//
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_tag);
//初始化组件
clickBtn = (Button)findViewById(R.id.clickBtn);
showTxt = (TextView)findViewById(R.id.showTxt);
}
public void clickMe(View v){
//实现事件处理方法
showTxt.setText("btn按钮标签单击了!!!");
}
}
- 效果: