Android_基于监听的事件处理机制

人生处万类,知识最为贤。这篇文章主要讲述Android_基于监听的事件处理机制相关的知识,希望能为你提供帮助。
一、引言
        在经过几天的学习之后, 首先熟悉了几大基本布局以及一些常用控件的使用方法,目前正在学习如何实现一个基本的登录注册界面及其功能,而实现功能就需要我们采用事件处理机制来进行调用事件处理方法。以下,就是我总结的一些事件处理机制。
 
二、常用监听接口

  • View.OnClickListener  单击事件监听器必须实现的接口
  • View.OnCreateContextMenuListener  创建上下文菜单事件
  • View.OnFocusChangeListener  焦点改变事件
  • View.OnKeyListener  按键事件监听器
  • View.OnLongClickListener  长按事件监听器
  • View.OnTouchListener  触摸屏事件监听器
 
三、基于监听的事件处理机制
(一)首先,事件监听机制中由事件源,事件,事件监听器三类对象组成。
事件监听器处理流程:
  1. 为事件源(例如:button)设置一个监听器,用于监听用户的操作(点击操作等)
  2. 用户做出的操作触发事件源的监听器
  3. 自动生成对应的事件对象
  4. 将事件源对象作为参数传给事件监听器
  5. 事件监听器对事件对象进行判断,执行对应的事件处理器(处理方法)
Android_基于监听的事件处理机制

文章图片

 
 
(二)五种不同使用方式:
以给按钮添加点击生成Toast信息事件为例
1.用匿名内部类
该方法是最为常用的方法,但是复用性不高
1 Button bt1=(Button)findViewById(R.id.bt1); 2 3bt1.setOnclickListener(new View.OnClickListener(){ 4 5 //重写点击事件的处理方法onClick() 6 7 @Override 8 9 public void onClick(View v){ 10 11//显示Toast信息 12 13Toast.makeText(getApplicationContext(),”点击按钮”,Toast.LENGTH_SHORT).show(); 14 15} 16 17 }

 
2.使用内部类
和上面的匿名内部类不同,其优点是在该类中可以进行复用,可直接访问外部类的所有界面组件。
 
1 public class MainActivity extends Activity { 2 3private Button bt1; 4 5@Override 6 7protected void onCreate(Bundle savedInstanceState) { 8 9Super.onCreate(saveInstanceState); 10 11SetContentView(R.layout.activity); 12 13Bt1 = (Button) findViewById(R.id.bt1); 14 15//直接new一个内部类对象作为参数 16 17Bt1.setOnClickListener(new BtnClickListener()); 18 19} 20 21 //定义一个内部类,实现View.OnClickListener接口,并重写onClick()方法 22 23Class BtnClickListener implements View.OnClickListener 24 25{ 26 27@Override 28 29Public void onClick (View v){ 30 31Toast.makeText(getApplicationContext(),”点击按钮”, Toast.LENGTH_SHORT).show(); 32 33} 34 35} 36 37 }

 
 
3.使用外部类
        另外创建一个处理时间的java文件,这种形式用的比较少,因为外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用,这昂导致的结果就是代码不够简洁。
  创建一个外部类:
1 public class Myclick implements View.OnClickListener{ 2private TextView textView; 3//把文本框作为参数传入 4public Myclick(TextView v){ 5textView = v; 6} 7@Override 8public void onClick(View v){ 9//点击按钮后重设文本框的文字 10textView.setText("已点击按钮"); 11} 12 }

MainActivity.java:
1 public class MainActivity extends Activity{ 2private Button btn1; 3private TextView tv1; 4@Override 5protected void onCreate(Bundle savadInstanceState){ 6super.onCreate(savadInstanceState); 7setContentView(R.layout.activty_main); 8btn1 = (Button) findViewById(R.id.btn1); 9tv1 = (TextView) findViewById(R.id.tv1); 10//new一个外部类,并把TEXTVIEW作为参数传入 11btn1.setOnClickListener(new Myclick(tv1)); 12} 13 }

 
4.直接使用Activity作为事件监听器
    让Actiity类实现XxxListener事件监听接口,在Activity中定义重写对应的时间处理器方法。
    eg:Activity类实现了OnClickListener接口,重写了OnClick(View v)方法在为某些组件添加事件监听对象时,直接setXxx.Listener(this)即可
1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.view.View; 4 import android.widget.Button; 5 import android.widget.Toast; 6 7 public class MainActivity extends Activity implements View.OnClickListener{ 8private Button btn; 9@Override 10protected void onCreate(Bundle savedInstanceState){ 11super.onCreate(savedInstanceState); 12setContentView(R.layou.activity_main); 13 14btn = (Button) findViewById(R.id.btn); 15btn.setOnClickListener(this); 16 17} 18 19//重写接口中的抽象方法 20@Override 21public void onClck(View v){ 22Toast.makeText(getApplicationContext(),"点击了按钮",Toast.LENGTH_SHORT).show(); 23} 24 }

 
5.直接绑定标签
      在xml布局文件中对应的Activity中定义一个事件处理方法
eg:public void myClick(View source)   
        source对应事件源(组件)接着布局文件中对应要触发事件的组件,设置一个属性: onclick="myclick"即可
 
MainActivity.java
1 public class MainActivity extends Activity{ 2private Button btn; 3@Override 4protected void onCreate(Bundle savedInstanceState){ 5super.onCreate(savedInstanceState); 6setContentView(R.layou.activity_main); 7 8 9 10} 11 12//自定义一个方法,传入一个view组件作为参数 13public void myclick(View source){ 14Toast.makeText(getApplicationContext(),"点击按钮",Toast.LENGTH_SHORT).show(); 15} 16 17 }

 
main.xml布局文件:
1 < ?xml version="1.0" encoding="utf-8"?> 2 < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3android:orientation="vertical" android:layout_width="match_parent" 4android:layout_height="match_parent"> 5 6< Button 7android:layout_width="wrap_content" 8android:layout_height="wrap_content" 9android:text="按钮" 10android:onClick="myclick"/> 11 12 < /LinearLayout>

 
  四、总结
    在我们使用中,会根据不同的情况,而选择不同的方法去对事件进行处理。
    方法1(匿名),一般用于给特定组件的特定业务响应
    方法2和方法3(内部类与外部类),可以同时为多个UI共同的事件处理,适用于对个UI组件复用,但当事件源要传递信息给事件监听器时则不太灵活,必须通过成员变量及构造方法
    方法4(activity本身作为监听器),是我们日常业务中应用最多的一种方法。
    方法5(xml标签),通过设置UI组件的android:onClick属性,然后通过代码实现方法,这种方式因为业务逻辑和UI耦合性太高,实际业务中一般不用
【Android_基于监听的事件处理机制】 

    推荐阅读