文章目录
一、事件监听是什么?
其实就简单的一句话:响应用户的操作,然后在后台加上相应的操作。比如:我们点击了页面上的一个按钮,事件监听捕捉到了点击
,然后再给出用户一种反馈。
二、事件监听机制流程
话不多说,先上个流程图:
写一个事件大致步骤为:
- 进行
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();
}