1. 程式人生 > >Android學習筆記1:基於監聽的事件處理過程

Android學習筆記1:基於監聽的事件處理過程

基於監聽的事件處理過程

記錄一:安卓介面互動處理事件的兩個方式

(1)基於監聽的事件處理

(2)基於回撥的事件處理

基於回撥的事件處理日後再寫,先學習基於監聽的事件處理

通常以下步驟:

(1)例項化物件

(2)為事件源物件新增監聽器物件,例如set...Listener();

(3)當事件發生時,系統會將事件封裝成相應型別的物件,傳送給註冊事件源的監聽器物件

(4)當監聽器物件接收事件物件後,系統會呼叫監聽器中相應的事件處理方法來處理事件給出響應

常用的監聽介面有OnClickListener介面、OnLongClickListener介面、OnFocusChangeListener介面、OnKeyListener介面和OnTouchListener介面五種

OnClickListener使用:

java程式碼

package lesson.ssh.listenertest;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//例項化事件源
		Button btn = (Button) findViewById(R.id.button1);
		//為事件源註冊監聽介面
		btn.setOnClickListener(new OnClickListener() {
			//實現監聽介面內的事件處理方法
			@Override
			public void onClick(View v) {
				//在MainActivity活動中給出一個提示
				//提示內容為"You clicked the button"
				//Toast.LENGTH_SHORT短暫時間顯示
				//使用Toast中的show()方法顯示提示
				Toast.makeText(MainActivity.this, "You clicked the button",
						Toast.LENGTH_SHORT).show();
			}

		});
	}

佈局檔案:就一個按鈕

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

效果略,點選按鈕後就是一個吐司。

但是當有很多個按鈕的時候,像這樣一個一個例項化,註冊,監聽,還是很麻煩的,因此可以有另外一種處理方法,在佈局檔案中元件使用屬性android:onClick="onClick",這個方法只需要在活動中實現即可。引號裡面的是在java程式碼中要實現的方法名,隨意即可,但要一致。下面是一個具體的方法

佈局程式碼:

<LinearLayout 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"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".GameMain" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
		android:textSize="28dp"
		android:gravity="center"
        android:text="@string/app_name"/>
	<Button 
	    android:id="@+id/btn_about"
	    android:layout_width="200dp"
	    android:layout_height="wrap_content"
	    android:gravity="center"
	    android:text="@string/app_about"
	    android:textSize="18dp"
	    android:onClick="onClick"/>
	<Button 
	    android:id="@+id/btn_exit"
	    android:layout_width="200dp"
	    android:layout_height="wrap_content"
	    android:gravity="center"
	    android:text="@string/app_exit"
	    android:textSize="18dp"
	    android:onClick="onClick"/>
</LinearLayout>

java程式碼:GameMain.java

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class GameMain extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game_main);
    }
    
    //此處函式是針對點選按鈕後發生的反應
    public void onClick(View view)
    {
    	switch(view.getId())    //檢測是那個按鈕被點選了,查詢id
    	{
    	case R.id.btn_about:
    		Toast.makeText(GameMain.this, "點選了about按鈕", Toast.LENGTH_SHORT).show();
    		break;
    	case R.id.btn_exit:
    		this.finish();    //這個是程式退出
    		break;
    	}
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.game_main, menu);
        return true;
    }
    
}

OnLongClickListener:

跟OnClickListener差不多

比如用於按鈕,長時間按按鈕才對觸發的

都是先找控制元件、設監聽,重寫監聽介面內的事件處理方法

package lesson.ssh.listenertest;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * findViewById(int)的返回值是View類的例項
		 * */
		final TextView tv=(TextView)findViewById(R.id.textView1);
		//例項化事件源
		Button btn = (Button) findViewById(R.id.button1);
		//為事件源註冊監聽介面
		btn.setOnLongClickListener(new OnLongClickListener(){

			@Override
			public boolean onLongClick(View v) {
				// TODO Auto-generated method stub
				/**
				 * 設定文字顯示內容為“You clicked me!”
				 * 設定字型大小為30f
				 * 設定字型顏色為綠色
				 */
				tv.setText("You clicked me!");
				tv.setTextSize(30f);
				tv.setTextColor(Color.GREEN);

                                //此處用java實現TextView,當然也可以跟上邊那個用Toast

				return false;
			}
			
		});
		
	}

}

OnFocusChangeListener介面:

用來處理控制元件焦點發生改變的事件。當某個控制元件失去焦點或者獲得焦點時都會觸發該介面中的回撥方法

回撥方法:

public void onFocusChanges(View v,Boolean hasFocus)
//引數View v:v是觸發該事件的事件源
//引數hasFocus:引數hasFocus表示v的新狀態,即v是否是獲得焦點

具體的實現樣例

/**
 * 本次註冊監聽介面和原來有別,原來是在事件源上註冊監聽器,而本次是在活動上使用implements來繼承監聽介面
 * 然後使用某個檢視元件的例項,進行註冊,註冊方法xxx.setOnFocusChangeListener(this),xxx是檢視元件
 * 然後在你活動中重構並完成該介面的抽象方法onFocusChange
 * */
public class MainActivity extends Activity implements OnFocusChangeListener{
	TextView tv=null;
	EditText et1=null;
	EditText et2=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * findViewById(int)的返回值是View類的例項
		 * 使用該方法例項化tv,et1,et2
		 * */
		tv=(TextView)findViewById(R.id.textView1);//佈局檔案中,預留了id為textView1的TextView
		tv.setTextSize(30f);
		tv.setTextColor(Color.GREEN);
		et1=(EditText)findViewById(R.id.editText1);
		et2=(EditText)findViewById(R.id.editText2);
		/**
		 * 在事件源上註冊監聽介面
		 * */
		et1.setOnFocusChangeListener(this);
		et2.setOnFocusChangeListener(this);
		
	}
	/**
	 * 重構並完成監聽介面OnFocusChangeListener的抽象方法onFocusChange(View v, boolean hasFocus)
	 * 引數View arg0指的是與焦點有關的檢視元件,boolean hasFocus的值有true和false之分,true代表獲得焦點,false
	 * 表示失去焦點
	 * */
	@Override
	public void onFocusChange(View v, boolean hasFocus) {
		// TODO Auto-generated method stub
		switch(v.getId())
		{case R.id.editText1:    //監聽到第一個編輯框焦點改變
			if(hasFocus==true)    
			{
				tv.setText("EditText1 has focused");
			}			
			break;
		case R.id.editText2:    //監聽到第二個編輯框焦點發生改變
			if(hasFocus==true)   
			{
				tv.setText("EditText2 has focused");
			}
			break;
		}
	}

}

佈局檔案:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

(4)OnKeyListener介面

對手機鍵盤進行監聽的介面,通過對某個View註冊該監聽,當View獲得焦點並有鍵盤事件時,便會觸發該介面中的回撥方法

回撥方法:

public boolean onKey(View v,int keyCode,KeyEvent event)
//引數v:為事件的事件源控制元件
//引數keyCode: 引數keyCode為手機鍵盤的鍵盤碼
//引數event:引數event為鍵盤事件封裝類的物件,其中包含了事件的詳細資訊,例如發生的事件,事件的型別等

(5)OnTouchListener介面

用來處理手機螢幕事件的監聽介面的。當為View的範圍內觸控按下、擡起或滑動等動作時都會觸發該事件。

回撥方法:

public boolean onTouch(View v,MotionEvent event)
//引數v:需要實現onTouch方法
//引數event:引數event為事件封裝類的物件,其中封裝了觸發事件的詳細資訊,同樣包括事件的型別、觸發時間等資訊