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爲事件封裝類的對象,其中封裝了觸發事件的詳細信息,同樣包括事件的類型、觸發時間等信息

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章