zoukankan      html  css  js  c++  java
  • Android之基于监听的事件处理机制

    一、引言

           在经过几天的学习之后, 首先熟悉了几大基本布局以及一些常用控件的使用方法,目前正在学习如何实现一个基本的登录注册界面及其功能,而实现功能就需要我们采用事件处理机制来进行调用事件处理方法。以下,就是我总结的一些事件处理机制。

    二、常用监听接口

    • View.OnClickListener  单击事件监听器必须实现的接口
    • View.OnCreateContextMenuListener  创建上下文菜单事件
    • View.OnFocusChangeListener  焦点改变事件
    • View.OnKeyListener  按键事件监听器
    • View.OnLongClickListener  长按事件监听器
    • View.OnTouchListener  触摸屏事件监听器

    三、基于监听的事件处理机制

    (一)首先,事件监听机制中由事件源,事件,事件监听器三类对象组成。

    事件监听器处理流程

    1. 为事件源(例如:button)设置一个监听器,用于监听用户的操作(点击操作等)
    2. 用户做出的操作触发事件源的监听器
    3. 自动生成对应的事件对象
    4. 将事件源对象作为参数传给事件监听器
    5. 事件监听器对事件对象进行判断,执行对应的事件处理器(处理方法)

    (二)五种不同使用方式:

    以给按钮添加点击生成Toast信息事件为例

    1.用匿名内部类

    该方法是最为常用的方法,但是复用性不高

     1 Button bt1=(Button)findViewById(R.id.bt1);
     2 
     3         bt1.setOnclickListener(new View.OnClickListener(){
     4 
     5 //重写点击事件的处理方法onClick()
     6 
     7 @Override
     8 
     9 public void onClick(View v){
    10 
    11         //显示Toast信息
    12 
    13         Toast.makeText(getApplicationContext(),”点击按钮”,Toast.LENGTH_SHORT).show();
    14 
    15         }
    16 
    17 }

    2.使用内部类

    和上面的匿名内部类不同,其优点是在该类中可以进行复用,可直接访问外部类的所有界面组件。

     1 public class MainActivity extends Activity {
     2 
     3     private Button bt1;
     4 
     5     @Override
     6 
     7     protected void onCreate(Bundle savedInstanceState) {
     8 
     9         Super.onCreate(saveInstanceState);
    10 
    11         SetContentView(R.layout.activity);
    12 
    13         Bt1 = (Button) findViewById(R.id.bt1);
    14 
    15         //直接new一个内部类对象作为参数
    16 
    17         Bt1.setOnClickListener(new BtnClickListener());
    18 
    19     }
    20 
    21 //定义一个内部类,实现View.OnClickListener接口,并重写onClick()方法
    22 
    23     Class BtnClickListener implements View.OnClickListener
    24 
    25     {
    26 
    27         @Override
    28 
    29         Public void onClick (View v){
    30 
    31         Toast.makeText(getApplicationContext(),”点击按钮”, Toast.LENGTH_SHORT).show();
    32 
    33     }
    34 
    35     }
    36 
    37 }

    3.使用外部类

           另外创建一个处理时间的Java文件,这种形式用的比较少,因为外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用,这昂导致的结果就是代码不够简洁。

     创建一个外部类:

     1 public class Myclick implements View.OnClickListener{
     2     private TextView textView;
     3     //把文本框作为参数传入
     4     public Myclick(TextView v){
     5         textView = v;
     6     }
     7     @Override
     8     public void onClick(View v){
     9         //点击按钮后重设文本框的文字
    10         textView.setText("已点击按钮");
    11     }
    12 }

    MainActivity.java:

     1 public class MainActivity extends Activity{
     2     private Button btn1;
     3     private TextView tv1;
     4     @Override
     5     protected void onCreate(Bundle savadInstanceState){
     6         super.onCreate(savadInstanceState);
     7         setContentView(R.layout.activty_main);
     8         btn1 = (Button) findViewById(R.id.btn1);
     9         tv1 = (TextView) findViewById(R.id.tv1);
    10         //new一个外部类,并把TEXTVIEW作为参数传入
    11         btn1.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{
     8     private Button btn;
     9     @Override
    10     protected void onCreate(Bundle savedInstanceState){
    11         super.onCreate(savedInstanceState);
    12         setContentView(R.layou.activity_main);
    13         
    14         btn = (Button) findViewById(R.id.btn);
    15         btn.setOnClickListener(this);
    16         
    17     }
    18     
    19     //重写接口中的抽象方法
    20     @Override
    21     public void onClck(View v){
    22         Toast.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{
     2     private Button btn;
     3     @Override
     4     protected void onCreate(Bundle savedInstanceState){
     5         super.onCreate(savedInstanceState);
     6         setContentView(R.layou.activity_main);
     7 
     8 
     9 
    10     }
    11 
    12     //自定义一个方法,传入一个view组件作为参数
    13     public void myclick(View source){
    14         Toast.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"
     3     android:orientation="vertical" android:layout_width="match_parent"
     4     android:layout_height="match_parent">
     5     
     6     <Button
     7         android:layout_width="wrap_content"
     8         android:layout_height="wrap_content" 
     9         android:text="按钮"
    10         android:onClick="myclick"/>
    11 
    12 </LinearLayout>

     四、总结

       在我们使用中,会根据不同的情况,而选择不同的方法去对事件进行处理

       方法1(匿名),一般用于给特定组件的特定业务响应

       方法2和方法3(内部类与外部类),可以同时为多个UI共同的事件处理,适用于对个UI组件复用,但当事件源要传递信息给事件监听器时则不太灵活,必须通过成员变量及构造方法

       方法4(activity本身作为监听器),是我们日常业务中应用最多的一种方法。

       方法5(xml标签),通过设置UI组件的android:onClick属性,然后通过代码实现方法,这种方式因为业务逻辑和UI耦合性太高,实际业务中一般不用

  • 相关阅读:
    Ajax学习总结
    从零开始学Docker
    IBM Websphere MQ常用命令及常见错误
    Log4j学习总结
    Eclipse中各图标含义
    类加载机制与反射
    Feign【入门】
    Eureka【故障演练分析】
    Eureka【启用https】
    Eureka【开启http basic权限认证】
  • 原文地址:https://www.cnblogs.com/jiani/p/11557807.html
Copyright © 2011-2022 走看看