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耦合性太高,實際業務中一般不用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM