zoukankan      html  css  js  c++  java
  • Android——基于监听器的事件处理(转)

    事件,我们并不陌生!

      所有的基于UI的应用程序,事件都变得不可或缺!试想一下,如果我们做的程序单击按钮和其它控件都没有反应,那么就如同一个人在这个世界上听不到声音一样!

      Android为我们提供了两种方式的事件处理:(1)基于监听器的事件处理;(2)基于回调的事件处理。

      对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事件监听器;对于基于回调的事件处理而言,主要做法是重写Android组件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,我们只要重写它们就行。


      本章我们着重讲一下基于监听器的事件处理,基于回调的事件处理放在下一章讲解。

      相比于基于回调的事件处理,这是更具“面向对象”性质的事件处理方式。在监听器模型中,主要涉及三类对象:

      (1)事件源Event Source:产生事件的来源,通常是各种组件,如按钮,窗口等。

      (2)事件Event:事件封装了界面组件上发生的特定事件的具体信息,如果监听器需要获取界面组件上所发生事件的相关信息,一般通过事件Event对象来传递。

      (3)事件监听器Event Listener:负责监听事件源发生的事件,并对不同的事件做相应的处理。

    一、第一种:内部类作为监听器

      将事件监听器类定义成当前类的内部类。

      a)使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类。
      b)可以自由访问外部类的所有界面组件,这也是内部类的两个优势。

      我们前面的例子全部采用的该种方式!

      我们可以一起回顾一下:http://blog.csdn.net/jianghuiquan/article/details/8252430

      1、activity_main.xml界面文件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        tools:context=".MainActivity" >  
      
        <EditText  
            android:id="@+id/userName"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentLeft="true"  
            android:layout_alignParentTop="true"  
            android:layout_marginTop="34dp"  
            android:ems="10" >  
      
            <requestFocus />  
        </EditText>  
      
        <EditText  
            android:id="@+id/passWord"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentLeft="true"  
            android:layout_below="@+id/userName"  
            android:layout_marginTop="18dp"  
            android:ems="10"  
            android:inputType="textPassword" />  
      //定义了一个ID为login的按钮  
        <Button  
            android:id="@+id/login"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignRight="@+id/userName"  
            android:layout_below="@+id/passWord"  
            android:layout_marginTop="36dp"  
            android:text="登录" />  
      
    </RelativeLayout>  

    2、MainActivity.java程序文件

    package com.genwoxue.edittextbutton;  
      
    import android.os.Bundle;  
    import android.app.Activity;  
    import android.widget.EditText;  
    import android.widget.Button;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.widget.Toast;  
      
      
    public class MainActivity extends Activity {  
        private EditText tvUserName=null;  
        private EditText tvPassword=null;  
        private Button btnLogin=null;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
              
        tvUserName=(EditText)super.findViewById(R.id.userName);  
        tvPassword=(EditText)super.findViewById(R.id.passWord);  
        btnLogin=(Button)super.findViewById(R.id.login);  
      
         //为按钮注册监听事件  
        btnLogin.setOnClickListener(new LoginOnClickListener());  
             }  
             //事件监听器  
        private class LoginOnClickListener implements OnClickListener{  
            public void onClick(View v){  
                String username=tvUserName.getText().toString();  
                String password=tvPassword.getText().toString();  
                String info="用户名:"+username+"☆☆☆密码:"+password;  
                Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
            }  
        }  
    }  

    面的理论也许听起来让你头大,尤其java这一套事件监听模型,让很多尽管可能是其它语言编程高手也感觉甚不适应,但如果分析上面代码,则发现实际也是非常简单的。

      我们这个案例中:单击按钮,显示用户名和密码!

      事件:单击事件;

      (1)注册监听事件:btnLogin.setOnClickListener(new LoginOnClickListener());

      (2)事件监听器:private class LoginOnClickListener implements OnClickListener
      定义LoginOnClickListener类,从OnClickListener接口实现。

      就这么简单!

    二、第二种:匿名内部类作为事件监听器类

      如果事件监听器只是临时使用一次,建议使用匿名内部类形式的事件监听器更合适。

      我们仍然以上述例子为例,加以改造,学习一下如何使用“匿名内部类作为事件监听器类”。

      1、界面部分不变!

      activity_main.xml界面文件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        tools:context=".MainActivity" >  
      
        <EditText  
            android:id="@+id/userName"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentLeft="true"  
            android:layout_alignParentTop="true"  
            android:layout_marginTop="34dp"  
            android:ems="10" >  
      
            <requestFocus />  
        </EditText>  
      
        <EditText  
            android:id="@+id/passWord"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentLeft="true"  
            android:layout_below="@+id/userName"  
            android:layout_marginTop="18dp"  
            android:ems="10"  
            android:inputType="textPassword" />  
      //定义了一个ID为login的按钮  
        <Button  
            android:id="@+id/login"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignRight="@+id/userName"  
            android:layout_below="@+id/passWord"  
            android:layout_marginTop="36dp"  
            android:text="登录" />  
      
    </RelativeLayout>  

    2、源程序加以改造!

      MainActivity.java程序文件

    package com.genwoxue.anonymousinside;  
    import android.os.Bundle;  
    import android.app.Activity;  
    import android.widget.EditText;  
    import android.widget.Button;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.widget.Toast;  
    public class MainActivity extends Activity {  
      private EditText tvUserName=null;  
      private EditText tvPassword=null;  
      private Button btnLogin=null;  
      @Override  
      protected void onCreate(Bundle savedInstanceState) {  
      super.onCreate(savedInstanceState);  
      setContentView(R.layout.activity_main);  
        
      tvUserName=(EditText)super.findViewById(R.id.userName);  
      tvPassword=(EditText)super.findViewById(R.id.passWord);  
      btnLogin=(Button)super.findViewById(R.id.login);  
        btnLogin.setOnClickListener(new OnClickListener(){  
           public void onClick(View v){  
              String username=tvUserName.getText().toString();  
              String password=tvPassword.getText().toString();  
              String info="用户名:"+username+"☆☆☆密码:"+password;  
              Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
          }  
        });  
      }  
    }  

    三、对比

    我们对比一下这两种写法:

      1、第①种

      (1)注册:btnLogin.setOnClickListener(new LoginOnClickListener());  

      (2)内部类:

    private class LoginOnClickListener implements OnClickListener{  
    public void onClick(View v){  
        String username=tvUserName.getText().toString();  
        String password=tvPassword.getText().toString();  
        String info="用户名:"+username+"☆☆☆密码:"+password;  
        Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
    }  

    2、第②种

      实际上是把①种合二为一了,使用匿名内部类直接完成了。

    btnLogin.setOnClickListener(new OnClickListener(){  
                public void onClick(View v){  
                    String username=tvUserName.getText().toString();  
                    String password=tvPassword.getText().toString();  
                    String info="用户名:"+username+"☆☆☆密码:"+password;  
                    Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
                }  
            });  
  • 相关阅读:
    atan与atan2的区别
    UVALive 6324 Archery (求射箭覆盖的期望)
    哈希UVALive 6326 Contest Hall Preparation
    HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
    UVA:11183:Teen Girl Squad (有向图的最小生成树)
    POJ3164:Command Network(有向图的最小生成树)
    UVA10462:Is There A Second Way Left? (判断次小生成树)
    UVA10600:ACM Contest and Blackout(次小生成树)
    HDU4081:Qin Shi Huang's National Road System (任意两点间的最小瓶颈路)
    HDU1233:还是畅通工程(最小生成树)
  • 原文地址:https://www.cnblogs.com/Chenshuai7/p/5327000.html
Copyright © 2011-2022 走看看