Android中的事件处理总结-基于监听的事件处理

一、Android中的事件处理方法

事件处理:响应用户UI动作,提高应用程序交互性

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

2基于回调的事件处理机制

3Handler消息处理

 

二、基于监听的事件处理机制详解

1监听事件处理模型

   3个主要参与对象:

     Event Source(事件源):事件发生的来源。ex:按钮、菜单、窗口等各个UI组件

     Event(事件):UI上面的事件源发生的特定的事件。 ex:按钮上面的一次点击

     Event Listener(事件监听器):监听事件源发生的事件,并对被监听的事件做出相应的响应。ex:监听登录按钮点击事件,处理登录的业务的响应

           

       事件监听,是自己本身不对事件处理,而是将事件委托给更专业更专门的事件监听器处理

       ex:消防所(事件监听器)监听所有的火灾事件并处理火灾,所有的企事业单位(事件源)当发生火灾时本身自己无法灭火,都委拖给消防所来灭火


2监听事件响应处理方法

     demo:界面布局文件 activity_main.xml

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <TextView   
  12.         android:id="@+id/tv_username"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:height="50dip"  
  16.         android:text="用户名:"/>  
  17.     <EditText   
  18.         android:id="@+id/et_username"  
  19.         android:layout_alignBaseline="@id/tv_username"  
  20.         android:layout_toRightOf="@id/tv_username"  
  21.         android:layout_width="match_parent"  
  22.         android:layout_height="wrap_content"  
  23.         android:inputType="text"/>  
  24.     <TextView   
  25.         android:id="@+id/tv_passwd"  
  26.         android:layout_below="@id/tv_username"  
  27.         android:layout_width="wrap_content"  
  28.         android:layout_height="wrap_content"  
  29.         android:height="50dip"  
  30.         android:text="密    码:"/>  
  31.     <EditText   
  32.         android:id="@+id/et_passwd"  
  33.         android:layout_alignBaseline="@id/tv_passwd"  
  34.         android:layout_alignStart="@id/et_username"  
  35.         android:layout_width="fill_parent"  
  36.         android:layout_height="wrap_content"  
  37.         android:inputType="textPassword"/>  
  38.           
  39.     <!-- Button有设置android:onClick的属性,代码里面应该写一个同名的方法login -->    
  40.     <Button   
  41.         android:id="@+id/btn_login"  
  42.         android:layout_below="@id/tv_passwd"  
  43.         android:layout_centerHorizontal="true"  
  44.         android:layout_width="wrap_content"  
  45.         android:layout_height="wrap_content"  
  46.         android:text="登  录"  
  47.         android:onClick="login"/>  
  48. </RelativeLayout>  

 

     1).通过UI布局文件,设定UI的android:onClick的属性(事件处理方法)

           Ⅰ.UI的布局文件里面,设置UI组件的android:onClick方法

           Ⅱ.代码里面有个跟android:onClick设置的同名方法,且该方法必须是public void的,同时有一个View类型的参数

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yihui.event;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.widget.EditText;  
  7. import android.widget.Toast;  
  8.   
  9. public class MainActivity1 extends Activity {  
  10.   
  11.     private EditText et_username;  
  12.     private EditText et_passwd;  
  13.       
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.           
  19.         et_username = (EditText) findViewById(R.id.et_username);  
  20.         et_passwd = (EditText) findViewById(R.id.et_passwd);  
  21.     }  
  22.       
  23.     /* 通过android:onClick 设置的对应方法事件处理函数 ,该方法必须是public void的,并且必须接受一个View类型的参数*/  
  24.     public void login(View view){  
  25.         String message = et_username.getText().toString() + "\n" + et_passwd.getText().toString();  
  26.         Toast.makeText(MainActivity1.this,message,0).show();  
  27.     }  
  28. }  

     2).通过 匿名类 响应事件

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yihui.event;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.Toast;  
  11.   
  12. public class MainActivity2 extends Activity {  
  13.   
  14.     private static final String TAG = "MainActivity2";  
  15.     private EditText et_username;  
  16.     private EditText et_passwd;  
  17.     private Button btn_login;  
  18.       
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.           
  24.         et_username = (EditText) findViewById(R.id.et_username);  
  25.         et_passwd = (EditText) findViewById(R.id.et_passwd);  
  26.         btn_login = (Button) findViewById(R.id.btn_login);  
  27.           
  28.         /* 匿名类处理事件响应*/  
  29.         btn_login.setOnClickListener(new OnClickListener(){    
  30.             public void onClick(View v){  
  31.                 Log.i(TAG, "UI setOnClickListener");  
  32.                 String message = et_username.getText().toString() + "\n" + et_passwd.getText().toString();  
  33.                 Toast.makeText(MainActivity2.this,message,0).show();  
  34.             }    
  35.           });    
  36.     }  
  37. }  

     3).通过 内部类 响应事件

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yihui.event;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.Toast;  
  11.   
  12. public class MainActivity3 extends Activity {  
  13.   
  14.     private static final String TAG = "MainActivity3";  
  15.     private EditText et_username;  
  16.     private EditText et_passwd;  
  17.     private Button btn_login;  
  18.       
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.           
  24.         et_username = (EditText) findViewById(R.id.et_username);  
  25.         et_passwd = (EditText) findViewById(R.id.et_passwd);  
  26.         btn_login = (Button) findViewById(R.id.btn_login);  
  27.           
  28.         /* 内部类处理事件响应, */  
  29.         btn_login.setOnClickListener(new MyListener());   
  30.     }  
  31.       
  32.   
  33.     /* 内部类作为事件监听器 */  
  34.     class MyListener implements OnClickListener {  
  35.   
  36.         @Override  
  37.         public void onClick(View v) {  
  38.             Log.i(TAG, "内部类处理事件响应");  
  39.             String message = et_username.getText().toString() + "\n" + et_passwd.getText().toString();  
  40.             Toast.makeText(MainActivity3.this,message,0).show();  
  41.         }  
  42.     }  
  43. }  

     4).通过 外部类 响应事件

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yihui.event;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.Button;  
  6. import android.widget.EditText;  
  7.   
  8. public class MainActivity4 extends Activity {  
  9.   
  10.     private EditText et_username;  
  11.     private EditText et_passwd;  
  12.     private Button btn_login;  
  13.       
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.           
  19.         et_username = (EditText) findViewById(R.id.et_username);  
  20.         et_passwd = (EditText) findViewById(R.id.et_passwd);  
  21.         btn_login = (Button) findViewById(R.id.btn_login);  
  22.           
  23.         /* 外部类处理事件响应, 可通过重写监听器的构造方法传递信息*/  
  24.         btn_login.setOnClickListener(new MyExternListener(MainActivity4.this,et_username,et_passwd));     
  25.     }  
  26. }  

           外部事件监听器类:MyExternListener.Java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yihui.event;  
  2.   
  3. import android.app.Activity;  
  4. import android.util.Log;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.EditText;  
  8. import android.widget.Toast;  
  9.   
  10. public class MyExternListener implements OnClickListener {  
  11.   
  12.     private static final String TAG = "MyExternListener";  
  13.       
  14.     /*通过事件监听器的成员变量及重写构造方法,事件源可以传递信息给事件监听器*/  
  15.     private Activity activity;  
  16.     private EditText username;  
  17.     private EditText passwd;  
  18.   
  19.     public MyExternListener(Activity activity, EditText username,  
  20.             EditText passwd) {  
  21.         this.activity = activity;  
  22.         this.username = username;  
  23.         this.passwd = passwd;  
  24.     }  
  25.   
  26.     @Override  
  27.     public void onClick(View v) {  
  28.         Log.i(TAG, "外部类处理事件响应  ");  
  29.         String message = username.getText().toString() + "\n" + passwd.getText().toString();  
  30.         Toast.makeText(activity, message, 0).show();  
  31.     }  
  32.   
  33. }  

     5).通过 Activity自身类 响应事件

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yihui.event;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.Toast;  
  11.   
  12. public class MainActivity5 extends Activity implements OnClickListener {  
  13.   
  14.     private static final String TAG = "MainActivity5";  
  15.     private EditText et_username;  
  16.     private EditText et_passwd;  
  17.     private Button btn_login;  
  18.       
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.           
  24.         et_username = (EditText) findViewById(R.id.et_username);  
  25.         et_passwd = (EditText) findViewById(R.id.et_passwd);  
  26.         btn_login = (Button) findViewById(R.id.btn_login);  
  27.           
  28.         /* 自身处理事件响应,1.监听器设置为this代表的自身类、2.自身类实现事件监听接口、3.自身类添加接口为实现的方法 */  
  29.         btn_login.setOnClickListener(this);   
  30.     }  
  31.   
  32.       
  33.     @Override  
  34.     public void onClick(View v) {  
  35.         Log.i(TAG, "UI setOnClickListener  " + String.valueOf(R.id.btn_login == v.getId()));    //参数v返回了事件源的一些信息  
  36.         String message = et_username.getText().toString() + "\n" + et_passwd.getText().toString();  
  37.         Toast.makeText(MainActivity5.this,message,0).show();  
  38.     }  
  39. }  

      5种方法实现的效果都是点击“登录”按钮,弹出用户输入的“用户名”和“密码”信息

       


35种监听听事件处理方法对比总结

     1).通过设置UI组件的android:onClick属性,然后代码实现方法:此方法业务逻辑和UI耦合性太高,实际业务一般不用

     2).匿名类:一般只应用特定组件的特定业务响应

     3).内部类、4).外部类:可作为多个UI共同的事件处理,适用多个UI组件复用;当事件源要传递信息给事件监听器时则不太灵活,必须通过成员变量及构造方法

     5).Activity自身类:处理比较灵活,实际中用的最多

     6).当同一个UI对同一个事件注册多个监听器时,根据注册的顺序,最后注册的事件监听器优先触发,事件不再传递,最后触发的是通过UI设定的方法

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.yihui.event;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10.   
  11. /* 测试对同一个UI同一个事件注册多个事件监听器 */  
  12. public class MainActivity extends Activity implements OnClickListener {  
  13.   
  14.     private static final String TAG = "MainActivity";  
  15.       
  16.     private EditText et_username;  
  17.     private EditText et_passwd;  
  18.     private Button btn_login;  
  19.       
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.           
  25.         et_username = (EditText) findViewById(R.id.et_username);  
  26.         et_passwd = (EditText) findViewById(R.id.et_passwd);  
  27.         btn_login = (Button) findViewById(R.id.btn_login);    
  28.           
  29.         /* 自身类 */  
  30.         btn_login.setOnClickListener(this);  
  31.          
  32.           
  33.         /* 匿名类处理事件响应  */  
  34.         btn_login.setOnClickListener(new OnClickListener(){    
  35.             public void onClick(View v){  
  36.                 Log.i(TAG, "匿名类处理事件响应");  
  37.             }    
  38.           });  
  39.           
  40.         /* 外部类处理事件响应, 可通过重写监听器的构造方法传递信息*/  
  41.         btn_login.setOnClickListener(new MyExternListener(MainActivity.this,et_username,et_passwd));  
  42.     }  
  43.   
  44.     /* UI android:onClick属性设置的对应的方法实现事件监听 */  
  45.     public void login(View v){  
  46.         Log.i(TAG, "UI android:onClick属性设置的对应的方法实现事件监听");  
  47.     }  
  48.       
  49.     /* 内部类作为事件监听器 */  
  50.     class MyListener implements OnClickListener {  
  51.   
  52.         @Override  
  53.         public void onClick(View v) {  
  54.             Log.i(TAG, "内部类处理事件响应");  
  55.         }  
  56.     }  
  57.       
  58.     /* 自身类作为事件监听器时,实现接口并实现接口里面的方法   */  
  59.     @Override  
  60.     public void onClick(View v) {  
  61.         Log.i(TAG, "Activity  自身类监听 ");  
  62.     }  
  63. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值