Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android技術基礎 >> 第18章、基於監聽器的事件處理(從零開始學Android)

第18章、基於監聽器的事件處理(從零開始學Android)

編輯:Android技術基礎

事件,我們並不陌生!

所有的基於UI的應用程序,事件都變得不可或缺!試想一下,如果我們做的程序單擊按鈕和其它控件都沒有反應,那麼就如同一個人在這個世界上聽不到聲音一樣!

Android為我們提供了兩種方式的事件處理:(1)基於監聽器的事件處理;(2)基於回調的事件處理。

對於基於監聽器的事件處理而言,主要就是為Android界面組件綁定特定的事件監聽器;對於基於回調的事件處理而言,主要做法是重寫Android組件特定的回調函數,Android大部分界面組件都提供了事件響應的回調函數,我們只要重寫它們就行。


本章我們著重講一下基於監聽器的事件處理,基於回調的事件處理放在下一章講解。

相比於基於回調的事件處理,這是更具“面向對象”性質的事件處理方式。在監聽器模型中,主要涉及三類對象:

(1)事件源Event Source:產生事件的來源,通常是各種組件,如按鈕,窗口等。

(2)事件Event:事件封裝了界面組件上發生的特定事件的具體信息,如果監聽器需要獲取界面組件上所發生事件的相關信息,一般通過事件Event對象來傳遞。

(3)事件監聽器Event Listener:負責監聽事件源發生的事件,並對不同的事件做相應的處理。

 

一、第一種:內部類作為監聽器

將事件監聽器類定義成當前類的內部類。

a)使用內部類可以在當前類中復用監聽器類,因為監聽器類是外部類的內部類。
b)可以自由訪問外部類的所有界面組件,這也是內部類的兩個優勢。

我們前面的例子全部采用的該種方式!

1、activity_main.xml界面文件

[html] view plain copy  
  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.     tools:context=".MainActivity" >  
  6.   
  7.     <EditText  
  8.         android:id="@+id/userName"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:layout_alignParentTop="true"  
  13.         android:layout_marginTop="34dp"  
  14.         android:ems="10" >  
  15.   
  16.         <requestFocus />  
  17.     EditText>  
  18.   
  19.     <EditText  
  20.         android:id="@+id/passWord"  
  21.         android:layout_width="wrap_content"  
  22.         android:layout_height="wrap_content"  
  23.         android:layout_alignParentLeft="true"  
  24.         android:layout_below="@+id/userName"  
  25.         android:layout_marginTop="18dp"  
  26.         android:ems="10"  
  27.         android:inputType="textPassword" />  
  28. //定義了一個ID為login的按鈕  
  29.     <Button  
  30.         android:id="@+id/login"  
  31.         android:layout_width="wrap_content"  
  32.         android:layout_height="wrap_content"  
  33.         android:layout_alignRight="@+id/userName"  
  34.         android:layout_below="@+id/passWord"  
  35.         android:layout_marginTop="36dp"  
  36.         android:text="登錄" />  
  37.   
  38. RelativeLayout>  

2、MainActivity.java程序文件

[java] view plain copy  
  1. package com.genwoxue.edittextbutton;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.widget.EditText;  
  6. import android.widget.Button;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Toast;  
  10.   
  11.   
  12. public class MainActivity extends Activity {  
  13.     private EditText tvUserName=null;  
  14.     private EditText tvPassword=null;  
  15.     private Button btnLogin=null;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.     super.onCreate(savedInstanceState);  
  20.     setContentView(R.layout.activity_main);  
  21.           
  22.     tvUserName=(EditText)super.findViewById(R.id.userName);  
  23.     tvPassword=(EditText)super.findViewById(R.id.passWord);  
  24.     btnLogin=(Button)super.findViewById(R.id.login);  
  25.   
  26. //為按鈕注冊監聽事件  
  27.     btnLogin.setOnClickListener(new LoginOnClickListener());  
  28.          }  
  29.          //事件監聽器  
  30.     private class LoginOnClickListener implements OnClickListener{  
  31.         public void onClick(View v){  
  32.             String username=tvUserName.getText().toString();  
  33.             String password=tvPassword.getText().toString();  
  34.             String info="用戶名:"+username+"☆☆☆密碼:"+password;  
  35.             Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
  36.         }  
  37.     }  
  38. }  

\

上面的理論也許聽起來讓你頭大,尤其java這一套事件監聽模型,讓很多盡管可能是其它語言編程高手也感覺甚不適應,但如果分析上面代碼,則發現實際也是非常簡單的。

我們這個案例中:單擊按鈕,顯示用戶名和密碼!

事件:單擊事件;

(1)注冊監聽事件:btnLogin.setOnClickListener(new LoginOnClickListener());

(2)事件監聽器:private class LoginOnClickListener implements OnClickListener
定義LoginOnClickListener類,從OnClickListener接口實現。

就這麼簡單!

 

二、第二種:匿名內部類作為事件監聽器類

如果事件監聽器只是臨時使用一次,建議使用匿名內部類形式的事件監聽器更合適。

我們仍然以上述例子為例,加以改造,學習一下如何使用“匿名內部類作為事件監聽器類”。

1、界面部分不變!

activity_main.xml界面文件

[html] view plain copy  
  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.     tools:context=".MainActivity" >  
  6.   
  7.     <EditText  
  8.         android:id="@+id/userName"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:layout_alignParentTop="true"  
  13.         android:layout_marginTop="34dp"  
  14.         android:ems="10" >  
  15.   
  16.         <requestFocus />  
  17.     EditText>  
  18.   
  19.     <EditText  
  20.         android:id="@+id/passWord"  
  21.         android:layout_width="wrap_content"  
  22.         android:layout_height="wrap_content"  
  23.         android:layout_alignParentLeft="true"  
  24.         android:layout_below="@+id/userName"  
  25.         android:layout_marginTop="18dp"  
  26.         android:ems="10"  
  27.         android:inputType="textPassword" />  
  28. //定義了一個ID為login的按鈕  
  29.     <Button  
  30.         android:id="@+id/login"  
  31.         android:layout_width="wrap_content"  
  32.         android:layout_height="wrap_content"  
  33.         android:layout_alignRight="@+id/userName"  
  34.         android:layout_below="@+id/passWord"  
  35.         android:layout_marginTop="36dp"  
  36.         android:text="登錄" />  
  37.   
  38. RelativeLayout>  

2、源程序加以改造!

MainActivity.java程序文件

[java] view plain copy  
  1. package com.genwoxue.anonymousinside;  
  2. import android.os.Bundle;  
  3. import android.app.Activity;  
  4. import android.widget.EditText;  
  5. import android.widget.Button;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Toast;  
  9. public class MainActivity extends Activity {  
  10.   private EditText tvUserName=null;  
  11.   private EditText tvPassword=null;  
  12.   private Button btnLogin=null;  
  13.   @Override  
  14.   protected void onCreate(Bundle savedInstanceState) {  
  15.   super.onCreate(savedInstanceState);  
  16.   setContentView(R.layout.activity_main);  
  17.     
  18.   tvUserName=(EditText)super.findViewById(R.id.userName);  
  19.   tvPassword=(EditText)super.findViewById(R.id.passWord);  
  20.   btnLogin=(Button)super.findViewById(R.id.login);  
  21.     btnLogin.setOnClickListener(new OnClickListener(){  
  22.        public void onClick(View v){  
  23.           String username=tvUserName.getText().toString();  
  24.           String password=tvPassword.getText().toString();  
  25.           String info="用戶名:"+username+"☆☆☆密碼:"+password;  
  26.           Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
  27.       }  
  28.     });  
  29.   }  
  30. }  

\

三、對比

\

   我們對比一下這兩種寫法:

1、第①種

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

(2)內部類:

[java] view plain copy  
  1.       private class LoginOnClickListener implements OnClickListener{  
  2. public void onClick(View v){  
  3.     String username=tvUserName.getText().toString();  
  4.     String password=tvPassword.getText().toString();  
  5.     String info="用戶名:"+username+"☆☆☆密碼:"+password;  
  6.     Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
  7. }  


2、第②種

實際上是把①種合二為一了,使用匿名內部類直接完成了。

 

[java] view plain copy  
  1. btnLogin.setOnClickListener(new OnClickListener(){  
  2.             public void onClick(View v){  
  3.                 String username=tvUserName.getText().toString();  
  4.                 String password=tvPassword.getText().toString();  
  5.                 String info="用戶名:"+username+"☆☆☆密碼:"+password;  
  6.                 Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show();  
  7.             }  
  8.         });  
  9.  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved