1. 程式人生 > >Android的按鈕單擊事件及監聽器的實現方式(附例項)

Android的按鈕單擊事件及監聽器的實現方式(附例項)

第一種:匿名內部類作為事件監聽器類

1.gif
大部分時候,事件處理器都沒有什麼利用價值(可利用程式碼通常都被抽象成了業務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適,實際上,這種形式是目前是最廣泛的事件監聽器形式。上面的程式程式碼就是匿名內部類來建立事件監聽器的!!!
對於使用匿名內部類作為監聽器的形式來說,唯一的缺點就是匿名內部類的語法有點不易掌握,如果讀者java基礎紮實,匿名內部類的語法掌握較好,通常建議使用匿名內部類作為監聽器。
第二種:內部類作為監聽器
2.gif

將事件監聽器類定義成當前類的內部類。1、使用內部類可以在當前類中複用監聽器類,因為監聽器類是外部類的內部類,2、所以可以自由訪問外部類的所有介面元件。這也是內部類的兩個優勢。上面程式碼就是內部類的形式!!
第三種:Activity本身作為事件監聽器
3.gif

這種形式使用activity本身作為監聽器類,可以直接在activity類中定義事件處理器方法,這種形式非常簡潔。但這種做法有兩個缺點:(1)這種形式可能造成程式結構混亂。Activity的主要職責應該是完成介面初始化;但此時還需包含事件處理器方法,從而引起混亂。(2)如果activity介面類需要實現監聽器介面,讓人感覺比較怪異。
上面的程式讓Activity類實現了OnClickListener事件監聽介面,從而可以在該Activity類中直接定義事件處理器方法:onClick(view v),當為某個元件新增該事件監聽器物件時,直接使用this作為事件監聽器物件即可。

第四種:外部類作為監聽器
ButtonTest類
4.gif


當用戶單擊button按鈕時,程式將會觸發MyButtonListener監聽器
外部MyButtonListener類
5.gif

使用頂級類定義事件監聽器類的形式比較少見,主要因為如下兩個原因:
1、事件監聽器通常屬於特定的gui介面,定義成外部類不籃球提高程式的內聚性。
2、外部類形式的事件監聽器不能自由訪問建立gui介面的類中的元件,程式設計不夠簡潔。
但如果某個事件監聽器確實需要被多個gui介面所共享,而且主要是完成某種業務邏輯的實現,則可以考慮使用外部類的形式來定義事件監聽器類。
第五種:直接繫結到標籤
Android還有一種更簡單的繫結事件監聽器的的方式,直接在介面佈局檔案中為指定標籤繫結事件處理方法。
對於很多Android標籤而言,它們都支援如onClick、onLongClick等屬性,這種屬性的屬性值就是一個形如xxx
(View source)
的方法的方法名。在佈局檔案中為button新增屬性,如一程式碼:
6.gif


為Button按鈕繫結一個事件處理方法:clickHanlder,這意味著開發者需要在該介面佈局對應的Activity中定義一個void clickHanler(View source)方法,該方法將會負責處理該按鈕上的單擊事件。
下面是該介面佈局對應的java程式碼:

7.gif

自己做的一個例項:

package ******;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;

public class MainActivity extends Activity implements OnClickListener {

	private Button loginButton;
	private ImageButton loginImageButon;
	private Button confirmButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//監聽事件   匿名內部類實現
		loginButton = (Button)findViewById(R.id.button1);
		loginButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//System.out.println("Button is clicked!(內部類)");
				Log.i("tag","Button is clicked!(內部類)");
			}
		});
		
		//監聽事件    獨立類實現
		loginImageButon = (ImageButton) findViewById(R.id.imageButton1);
		loginImageButon.setOnClickListener(listener);
		
		//監聽事件   介面類實現
		confirmButton = (Button) findViewById(R.id.button2);
		confirmButton.setOnClickListener(this);
	}
	
	
	OnClickListener listener = new OnClickListener() {
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			//System.out.println("ImageButton is clicked!(獨立類)");
			Log.i("tag","ImageButton is clicked!(獨立類)");
		}
	};

	
	public void onClick(View v){
		//System.out.println("Button2 is clicked!(介面類)");
		Log.i("tag","Button2 is clicked!(介面類)");
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}