一、知识点
1、定义:为用户动作提供响应的机制就是事件处理。
2、Android提供了两套强大的事件处理机制:
- 基于监听的事件处理
- 基于回调的事件处理
3、区别:一般来说,基于回调的事件处理可用于处理一些通用性的事件,基于回调的事件处理代码会比较简洁;但是对于某些特定的事件,无法使用基于回调的事件处
理,只
能采用监听的事件处理。
4、事件监听有如下几个形式:
- 内部类形式
- 外部类形式
- Activity本身作为事件的监听器
- 匿名内部类
- 直接绑定标签
5、在基于监听的事件处理模式中,事件监听器必须实现事件监听接口,Android为不同的界面组件提供了不同的监听接口,这些接口通常以内部类的形式存。以View为例,它包含了如下几个内部接口:
- View.OnClickListener:单击事件的事件监听器必须实现的接口
- View.OnCreateContextMenuListener:创建上下文菜单事件的事件监听器必须实现的接口
- View.onFocusChangeListener:焦点改变事件的事件监听器必须实现的接口
- View.OnKeyListener:按键事件的事件监听器必须实现的接口
- View.OnLongClickListener:长按事件的事件监听器必须实现的接口
- View.OnTounchListener:触摸事件的事件监听器必须实现的接口
二、实战
例1:
1、效果图
2、demo目录
3、xml文件
<pre name="code" class="html"><?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/in"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="内部类监听按钮"
android:textSize="21dp" />
<Button
android:id="@+id/ni"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="匿名内部类监听按钮"
android:textSize="21dp" />
<Button
android:id="@+id/out"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="外部类监听按钮"
android:textSize="21dp" />
<Button
android:id="@+id/tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickTip"
android:text="绑定标签监听按钮"
android:textSize="21dp" />
<Button
android:id="@+id/myself"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Activity本身监听按钮"
android:textSize="21dp" />
</LinearLayout>
4、外部类代码:
package com.example;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class OutOnClickListener implements OnClickListener {
private Activity MainActivity;
public OutOnClickListener(Activity MainActivity) {
this.MainActivity = MainActivity;
}
@Override
public void onClick(View v) {
Toast.makeText(MainActivity, "外部类按钮", 2000).show();
}
}
5、主文件代码:
package com.example;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
Button in, out, ni, tip, myself;//定义按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView(); 初始化UI
NiSetOnClickListener();// 匿名内部类监听
OutSetOnClickListener();// 外部类监听
InSetOnClickListeer();// 内部类监听
myself.setOnClickListener(this);// Activity本身作为事件的监听器
}
private void InSetOnClickListeer() {
in.setOnClickListener(new InClickListener());
}
private void OutSetOnClickListener() {
//直接调用外部类
out.setOnClickListener(new OutOnClickListener(this));
}
private void NiSetOnClickListener() {
ni.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "匿名内部类按钮", 2000).show();
}
});
}
public void clickTip(View v) {
Toast.makeText(this, "绑定标签按钮", 2000).show();
}
private void initView() {
in = (Button) findViewById(R.id.in);
out = (Button) findViewById(R.id.out);
ni = (Button) findViewById(R.id.ni);
tip = (Button) findViewById(R.id.tip);
myself = (Button) findViewById(R.id.myself);
}
class InClickListener implements OnClickListener {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "内部类按钮", 2000).show();
}
}
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Activity本身按钮", 2000).show();
}
}