基於監聽的事件處理機制


本節引言:

第二章我們學習的是Android的UI控件,我們可以利用這些控件構成一個精美的介面,但是僅僅是介面而已;下一步就要開始學習邏輯與業務實現了,本章節講解的是Android的事件處理機制!何為事件處理機制?舉個 簡單的例子,例如點擊一個按鈕,我們向伺服器發送登陸請求!當然,Android中的事件處理機制不只這一種, 例如螢幕發生選擇,我們點擊了螢幕上某個區域...簡單點說,事件處理機制就是我們和UI發生互動時,我們在背後加入一些小動作而已!本節我們來介紹使用的最頻繁的一種:基於監聽的事件處理機制!


1.基於監聽的時間處理機制模型:

#流程模型圖:

1.jpg

文字表述:

事件監聽機制中由事件來源事件事件監聽器三類物件組成 處理流程如下:Step 1:為某個事件來源(元件)設定一個監聽器,用於監聽使用​​者操作Step 2:使用者的操作,觸發了事件來源的監聽器Step 3:產生了對應的事件物件Step 4:將這個事件來源物件作為參數傳給事件監聽器step 5:事件監聽器對事件物件進行判斷,執行對應的事件處理器(對應事件的處理方法)

歸納:

事件監聽機制是一種委派式的事件處理機制,事件來源(元件)事件處理委託給事件監聽器 當事件來源發生指定事件時,就通知指定事件監聽器,執行對應的操作


#2.五種不同的使用形式:

我們以下面這個:簡單的按鈕點擊,提示Toast訊息的程式;使用五種不同的形式來實現!

效果圖:

2.png


#1)直接用匿名內部類別

平常最常使用的一種:直接setXxxListener後,重寫裡面的方法即可; 通常是臨時使用一次,復用性不高!

實作程式碼如下:MainAcivity.java:

#
package com.jay.example.innerlisten;    
    
import android.os.Bundle;    
導入 android.view.View;    
導入android.view.View.OnClickListener;    
導入 android.widget.Button;    
導入android.widget.Toast;    
導入android.app.Activity;    
    
#    
public 類 MainActivity 擴充 Activity {    
    private Button btnshow;    
        
    @Override    
    protected void onCreate(Bundle anceState);    
        setContentView(R.layout.activity_main);    
        btnshow = (按鈕) findViewById(R.id.btnshow);    
        btnshow.setOnClickListener(new OnClickListener() {    
             @Override    
            public void onClick(View v) {    資訊    
                Toast.makeText(getApplicationContext(), "你點選了按鈕", }    
        });    
    }        
}



##########################################################

2)使用內部類別

和上面的匿名內部類別不同哦! 使用優點:可以在該類別中進行複用,可直接存取外部類別的所有介面元件!

實作程式碼如下:MainAcivity.java:

package com.jay.example.innerlisten;    
    
#import android. os.Bundle;    
import android.view.View;    
import android.view.View.OnClickListener;    
import android.widget.Button android.app.Activity;    
    
    
public class MainActivity extends Activity {      
    protected void onCreate(Bundle savedInstanceState) {    
#        sup (savedInstanceState);    
        setContentView(R.layout.activity_main);    
             //直接new一個內部類別物件作為參數    
        btnshow .setOnClickListener(new BtnClickListener());    
    }     
#    //定義一個內部類別,實作 View.OnClickListener    
    {    
        @Override    
        public void onClick(View v) {   "按鈕被點選了", Toast.LENGTH_SHORT).show();   
        }    
    }
}


3)使用外部類別:

就是另外創建一個處理事件的Java檔案,這種形式用的比較少!因為外部類別不能直接存取使用者介面 類別中的元件,要透過構造方法將元件傳入使用;這樣導致的結果就是程式碼不夠簡潔!

ps:為了示範傳參,這裡用TextView取代Toast提示!

3.png

實作程式碼如下:MyClick.java:

package com.jay.example.innerlisten;    

#import android.view.View;    
#import android.view.View.OnClickListener;    
import android.widget.TextView
    private TextView textshow ;    
    //使用文字方塊當參數傳入    
    public MyClick(TextView txt)    ##   
    }    
    @Override    
    public void onClick(View v) {    
        //點選後設定文字方塊中顯示的文字    
        textshow.setText

MainActivity.java

package com.jay.example.innerlisten;    
導入android.os.Bundle;    
導入android.widget.Button;    
導入android.widget.TextView;    
導入android.app.Activity;    
    
#    
public 類 MainActivity 擴充 Activity {    
    private Button btnshow;    
    私有 TextView txtshow;    
    @Override    
#    protected void onCreate(Bundle savedInstanceState) {        
        setContentView(R.layout.activity_main);    
        btnshow = (按鈕) findViewById(R.id.btnshow);    
        txtshow = (TextView) findViewById(R.id.textshow);    
        //直接new一個外部類,並將TextView作為參數建立    
        btnshow.setOnClickListener(new MyClick(txtshow));    
    }         
}
#

4)直接使用Activity作為事件監聽器

只需要讓Activity類別實作XxxListener事件監聽介面,在Activity中定義重寫對應的事件處理器方法 eg:Actitity實作了OnClickListener介面,重寫了onClick(view)方法在為某些組成添加該事件監聽對象 時,直接setXxx.Listener(this)即可

實作程式碼如下:MainAcivity.java:

package com.jay.example. innerlisten;    
#import android.os.Bundle;    
import android.view.View;    
import android.view.View. widget.Toast;    
import android.app.Activity;    
    
//讓Activity方法實作OnClickListener介面       private Button btnshow;    
    @ Override    
    protected void onCreate(Bundle savedInstanceState) {    
      View(R.layout.activity_main);    
            
        btnshow  (Button)       btnshow  (Button)       btnshow .btnshow);    
        //直接寫個this    
        b}show重寫介面中的抽象方法    
    @Override    
    public void onClick (View v) {    
        Toast.makeText(getApplicationContext(), "點擊了按鈕", Toast.LENGTH_SHO );   
}

#

5)直接綁定到標籤:

就是直接在xml佈局檔中對應得Activity中定義一個事件處理方法 eg:public void myClick(View source)   source對應事件來源(元件) 接著佈局檔中對應要觸發事件的組成,設定一個屬性:onclick = "myclick"即可

實作程式碼如下:MainAcivity.java:

#package com.jay.example.caller;    
    
import android.app.Activity;    
import android.os. android.widget.Toast;    
    
public class MainActivity extends Activity {    
     {    
        super.onCreate(savedInstanceState);    
#        setContentView(R .layout.activity_main);     
卷    
        Toast.makeText(getApplicationContext( ), "按鈕被點擊了", Toast.LENGTH_SHORT).show();    
    }    
}

#

main.xml佈局檔:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"    
    android:id="@+id/LinearLayout1"    :layout_height=" match_parent"    
    android:orientation="vertical" >    
    android;Button            android:layout_height="wrap_content"    
        android:text="按鈕"
        and?了Android中的事件處理機制,例子中的是onClickListener點擊事件,當然除了這個以外還有其他的事件,例如onItemClickListener,凡是需要透過setXxxListener這些,基本上都是基於事件監聽的! 另外這五種方式用的比較多的是:1,2,3,5幾種,看具體情況而定~