Android | 事件监听处理机制的五种方式


一、事件监听是什么?

其实就简单的一句话:响应用户的操作,然后在后台加上相应的操作。比如:我们点击了页面上的一个按钮,事件监听捕捉到了点击,然后再给出用户一种反馈

二、事件监听机制流程

话不多说,先上个流程图:

在这里插入图片描述
写一个事件大致步骤为:

  • 进行UI设计
  • 加载UI,获得控件
  • 为该控件设置监听器,监听用户的操作
  • 用户触发事件源的监听器
  • 生成对应事件对象
  • 将产生的事件对象作为参数传入事件处理器
  • 对事件对象进行判断执行对应的事件的处理方法

三、五种不同的使用方式

任务:简单的按钮点击,提示Toast信息的程序

0、效果展示

在这里插入图片描述

1、直接用匿名内部类

按照上面的步骤:

第一步:设计UI,由于只弄了个Button,不再贴出代码,这个Button对应的ID是btn

第二步::加载UI,并获得控件。

首先先声明一个私有的对象:

private Button btn1;		//声明Button

然后通过findViewById找到这个控件并强制转换为Button类型

btn1 = (Button) findViewById(R.id.btn);		//通过findViewById找到对应的控件

第三步:设置监听器,使用setOnClickListener,然后匿名内部类里面重写了onClick方法

btn1.setOnClickListener(new OnClickListener() {		//为该控件绑定事件监听
	//重写onClik方法,并写上对应的操作
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Toast.makeText(getApplicationContext(), "你点击了按钮", Toast.LENGTH_LONG);
	}
});

接下来的步骤就是事件触发的具体流程了,不再赘述,请看上方流程图。

整合一下上述步骤:

	private Button btn1;		//声明Button

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn);		//通过findViewById找到对应的控件
		btn1.setOnClickListener(new OnClickListener() {		//为该控件绑定事件监听
			//重写onClik方法,并写上对应的操作
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), "你点击了按钮", Toast.LENGTH_LONG).show();
			}
		});
	}

匿名内部类是平常最常使用的一种,直接setXxxListeren后,重写里面的方法就行了;但它的复用性不高

2、使用内部类

有了上面的步骤,下面直接怼就行了:

	private Button btn1;		//声明Button

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn);		//通过findViewById找到对应的控件
		btn1.setOnClickListener(new BtnClickListener());		//直接new一个内部类当作参数传递
	}

	//定义一个类,实现OnClickListener接口
	class BtnClickListener implements OnClickListener{
		//重写方法
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Toast.makeText(getApplicationContext(), "你点击了按钮", Toast.LENGTH_LONG).show();
		}
	}

使用内部类可以进行复用,可以直接访问外部类的所有组件

3、使用外部类

由于外部类不能直接调用Activity界面上的控件,所以再调用外部类的时候需要用构造方法将需要的控件进行传递。

myClick.java

public class MyClick implements OnClickListener {

	private TextView tv;

	public MyClick(TextView tv) {
		// TODO Auto-generated constructor stub
		this.tv = tv;
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		tv.setText("你点击了按钮");
	}
}

MainActivity.java

	private Button btn1; // 声明Button
	private TextView tv1;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.text);
		btn1 = (Button) findViewById(R.id.btn); // 通过findViewById找到对应的控件
		tv1 = (TextView) findViewById(R.id.tv);
		btn1.setOnClickListener(new MyClick(tv1));
	}

一般很少使用外部类处理事件监听机制

4、直接使用Activity作为事件监听器

即用这个类直接实现OnClickListener接口,在这个类里面重写onClick方法即可:

public class MainActivity extends Activity implements OnClickListener {

	private Button btn1; // 声明Button
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.text);
		btn1 = (Button) findViewById(R.id.btn); // 通过findViewById找到对应的控件
		btn1.setOnClickListener(this);		//直接写this
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Toast.makeText(getApplicationContext(), "你点击了按钮", Toast.LENGTH_LONG).show();
	}
	//………还有方法没有列出
}

5、直接绑定到标签

直接在标签上绑定点击方法:

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试" 
        android:onClick="myClick"
        />

然后在直接写自定义方法:

	public void myClick(View v) {
		Toast.makeText(getApplicationContext(), "你点击了按钮", Toast.LENGTH_LONG).show();
	}
发布了211 篇原创文章 · 获赞 414 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/105221105