什么是监听事件?
监听事件就是等待某个事件的发生,当这个事件发生之后,对其做出一个响应。如:鼠标单击一个按钮,单击按钮时打开一个新的页面,或者双击桌面的应用图标,运行一个程序,这都是监听事件的应用。
监听三要素
- Event Source(事件源):监听的目标,假如我们给Button设置一个点击事件,那么Button就为事件源
- Event(事件):发生的事件,不同的事件需要相应的事件监听器进行处理,点击、触摸、按下等都是事件
- Event Listener(事件监听器):不同的事件监听器处理不同的监听事件
实例:
实例需求:
新建一个项目,在布局中添加一个按钮,给按钮设置监听事件,点击按钮,弹出一段提示文字(文字自定义)
需求分析:
1、添加按钮
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click Me"
android:textAllCaps="false"/>
2、设置监听事件
实例中是给Button设置一个点击事件,所以通过.setOnClickListener( )方法来进行设置,在设置之前我们要先创建事件,实现监听事件方法有很多,主要有以下五种:
2.1通过内部类实现:
找到声明控件,再编写一个内部类OnClick实现View.OnClickListener接口,为了提高代码的复用性,在该类中添加一个switch判断语句,通过view.getId( )方法获取到控件的id,根据id执行相应控件的监听事件,在监听事件中使用Toast弹出提示信息,创建好事件后,需要新建一个事件对象,再通过.setOnClickListener( )方法给Button添加该事件,如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mButton = findViewById(R.id.btn);
OnClick onClick = new OnClick();
mButton.setOnClickListener(onClick);
}
class OnClick implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn:
Toast.makeText(MainActivity.this, "通过内部类实现", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
实例演示
2.2通过匿名内部类实现
匿名内部类实现监听事件时这几种方法中最简单,代码量最少的实现方式,该类方法也是通过.setOnClickListener( )方法设置,在该方法中直接创建一个系统提供的View.OnClickListener( )对象,在该对象中编写监听事件,代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mButton = findViewById(R.id.btn);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "匿名内部类实现", Toast.LENGTH_SHORT).show();
}
});
}
}
实例演示
2.3外部类实现
创建一个类,实现View.OnClickListener接口,在该类中定义一个Activity类型的实例mActivity(因为这是一个公共类,所以可能在不同的Activity中被调用,使用mActivity接收调用的Activity,在监听事件中的Toast语句中传入Activity),在构造方法中传入,再重写onClick( )方法,在该方法中添加switch提高方法的复用性,在监听事件中使用Toast语句弹出提示信息。代码如下:
public class MyClick implements View.OnClickListener {
private Activity mActivity;
//创建一个构造方法,传入参数Activity
public MyClick(Activity activity) {
this.mActivity = activity;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn:
Toast.makeText(mActivity, "外部类实现", Toast.LENGTH_LONG).show();
break;
}
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mButton = findViewById(R.id.btn);
mButton.setOnClickListener(new MyClick(MainActivity.this));
}
}
实例演示
2.4通过事件源所在类实现
这个实例中,我们是给Button设置点击事件,所以事件源就为Button,而Button所在类为MainActivity,所以通过事件源所在类实现,只需要给MainActivity实现View.OnClickListener接口,在MainActivity中重写View.OnClickListener的onClick( )方法,如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mButton = findViewById(R.id.btn);
mButton.setOnClickListener(MainActivity.this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
Toast.makeText(this, "事件所在类实现", Toast.LENGTH_SHORT).show();
break;
}
}
}
实例演示
2.5通过onClick属性实现
在Button控件中有一个"onClick"属性,是用于给Button控件设置监听事件,创建一个监听事件作为属性值传入,代码如下:
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click Me"
android:onClick="show"
android:textAllCaps="false"/>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void show(View view){
switch (view.getId()){
case R.id.btn:
Toast.makeText(this, "onClick属性实现", Toast.LENGTH_SHORT).show();
}
}
}
实例演示
总结:
- 监听三要素:Event Source(事件源)、Event(事件)、Event Listener(事件监听器)
- 常用的五种监听方式的实现方式 :内部类、匿名内部类、外部类、事件源所在类、onClick属性