1. 程式人生 > >3.1.1 基於監聽的事件處理機制

3.1.1 基於監聽的事件處理機制

講解 基於 example this apk imp cal href eat

3.1.1 基於監聽的事件處理機制

http://www.runoob.com/w3cnote/android-tutorial-listen-event-handle.html

本節引言:

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

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

技術分享圖片

事件監聽機制中由事件源事件事件監聽器三類對象組成 處理流程如下:

Step 1:為某個事件源(組件)設置一個監聽器,用於監聽用戶操作

Step 2:用戶的操作,觸發了事件源的監聽器

Step 3:生成了對應的事件對象

Step 4:將這個事件源對象作為參數傳給事件監聽器

step 5:事件監聽器對事件對象進行判斷,執行對應的事件處理器(對應事件的處理方法)

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

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

1)直接用匿名內部類

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

實現代碼如下:

1.1 布局管理器添加一個按鈕

技術分享圖片

1.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;    
import android.widget.Toast;    
import android.app.Activity;    
    
    
public class MainActivity extends Activity {    
    private Button btnshow;    
        
    @Override    
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.activity_main);    
        btnshow = (Button) findViewById(R.id.btnshow);    
        btnshow.setOnClickListener(new OnClickListener() {    
            //重寫點擊事件的處理方法onClick()    
            @Override    
            public void onClick(View v) {    
                //顯示Toast信息    
                Toast.makeText(getApplicationContext(), "你點擊了按鈕", Toast.LENGTH_SHORT).show();    
            }    
        });    
    }        
} 

  2)使用內部類

使用優點:可以在該類中進行復用,可直接訪問外部類的所有界面組件!

  2.1布局管理器添加按鈕

技術分享圖片

2.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;    
import android.widget.Toast;    
import android.app.Activity;    
    
    
public class MainActivity extends Activity {    
//1 聲明 private Button btnshow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

//2 綁定控件 btnshow = (Button) findViewById(R.id.btnshow);
//3 綁定內部類方法 //直接new一個內部類對象作為參數 btnshow.setOnClickListener(new BtnClickListener()); }
//4 內部類方法 //定義一個內部類,實現View.OnClickListener接口,並重寫onClick()方法 class BtnClickListener implements View.OnClickListener { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "按鈕被點擊了", Toast.LENGTH_SHORT).show(); } } }

3)使用外部類:

是另外創建一個處理事件的Java文件,這種形式用的比較少!因為外部類不能直接訪問用戶界面 類中的組件,要通過構造方法將組件傳入使用;這樣導致的結果就是代碼不夠簡潔!

  ps:為了演示傳參,這裏用TextView代替Toast提示!

技術分享圖片

2.1 布局管理器添加按鈕和文本框

技術分享圖片

2.2MyClick.java:

package com.jay.example.innerlisten;    
    
import android.view.View;    
import android.view.View.OnClickListener;    
import android.widget.TextView;    
    
public class MyClick implements OnClickListener {    
    private TextView textshow;    
    //把文本框作為參數傳入    
    public MyClick(TextView txt)    
    {    
        textshow = txt;    
    }    
    @Override    
    public void onClick(View v) {    
        //點擊後設置文本框顯示的文字    
        textshow.setText("點擊了按鈕!");    
    }    
}

 2.3MainActivity.java

package com.jay.example.innerlisten;    
import android.os.Bundle;    
import android.widget.Button;    
import android.widget.TextView;    
import android.app.Activity;    
    
    
public class MainActivity extends Activity {    
// 1聲明按鍵和文本框 private Button btnshow; private TextView txtshow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//2 綁定控件 btnshow = (Button) findViewById(R.id.btnshow); txtshow = (TextView) findViewById(R.id.textshow);
//3 綁定函數 //直接new一個外部類,並把TextView作為參數傳入 btnshow.setOnClickListener(new MyClick(txtshow)); } }

 4)改寫按鍵自帶函數—-直接使用Activity作為事件監聽器

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

4.1main.xml布局文件 布局管理器加入按鍵

 技術分享圖片

2.2MainAcivity.java:

package com.jay.example.innerlisten;    
import android.os.Bundle;    
import android.view.View;    
import android.view.View.OnClickListener;    
import android.widget.Button;    
import android.widget.Toast;    
import android.app.Activity;    
    
//讓Activity方法實現OnClickListener接口    
public class MainActivity extends Activity implements OnClickListener{    
//1 聲明按鍵 private Button btnshow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //2 綁定按鍵控件 btnshow = (Button) findViewById(R.id.btnshow);
//3 修改按鍵自帶點擊函數 //直接寫個this btnshow.setOnClickListener(this); }
//4 修改函數具體內容 //重寫接口中的抽象方法 @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "點擊了按鈕", Toast.LENGTH_SHORT).show(); } }

  

5)附加外部函數——-直接綁定到標簽:

5.1main.xml布局文件 布局管理器加入按鍵

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"    
    android:id="@+id/LinearLayout1"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent"    
    android:orientation="vertical" >    
    <Button     
        android:layout_width="wrap_content"    
        android:layout_height="wrap_content"    
        android:text="按鈕"    
        android:onClick="myclick"/>    // 改寫自帶函數
 </LinearLayout> 

  MainAcivity.java:

package com.jay.example.caller;    
    
import android.app.Activity;    
import android.os.Bundle;    
import android.view.View;    
import android.widget.Toast;    
    
public class MainActivity extends Activity {    
    @Override    
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.activity_main);     
    }    
    //1自定義一個方法,傳入一個view組件作為參數    
    public void myclick(View source)    
    {    
        Toast.makeText(getApplicationContext(), "按鈕被點擊了", Toast.LENGTH_SHORT).show();    
    }    
} 

  

3.1.1 基於監聽的事件處理機制