Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android基於監聽的事件處理機制

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

編輯:關於Android編程

Android提供了強大的事件處理機制,主要包括兩大類:

1,基於監聽的事件處理機制:主要做法是為Android界面組件綁定特定的事件監聽器

2,基於回調的事件處理機制:主要做法是重寫Android組件特定的回調方法,或重寫Activity的回調方法。也就是說Android的絕大多數的界面組件都提供了事件響應的回調方法,開發者只要重寫它們即可

 

基於監聽的事件處理是一種更加面向對象的事件處理,這種事件處理方式與Java的Swing處理方式幾乎相同。

監聽處理模型:

事件源(Event Source):事件發生的場所,就是各個組件,比如按鈕,窗口,菜單等

事件(Event):事件封裝了界面組件上發生的特定事情(就是用戶操作)。如果程序需要獲得界面組件上所發生事件的相關信息,一般通過Event對象來獲取

事件監聽器(Event Listener):負責監聽事件源所發生的時間,並且對各個事件作出響應。

委派式事件處理方法:

普通組件(事件源)將整個事件處理委派給特定的對象(事件監聽器);當該事件源發生指定的時間是,就通知所委派的事件監聽器來處理這個事件。

每個組件都可以針對特定的時間指定一個事件監聽器,每個事件監聽器也可以監聽一個或多個事件源。因為同一個事件源上可能發生多個事件,委派式事件處理方式可以吧事件源上所有可能發生的時間分別授權給不同的事件處理器來處理;同時也可以讓一類事件都使用同一個事件監聽器來處理。

\

activity_main.xml

<!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%2D%2D%3E-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal">
<edittext android:id="@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:editable="false" android:cursorvisible="false" android:textsize="12pt">
<!--{cke_protected}{C}%3C!%2D%2D%20%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E6%8C%89%E9%92%AE%EF%BC%8C%E8%AF%A5%E6%8C%89%E9%92%AE%E5%B0%86%E4%BD%9C%E4%B8%BA%E4%BA%8B%E4%BB%B6%E6%BA%90%20%2D%2D%3E--><button android:id="@+id/bn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="單擊我"></button></edittext></linearlayout>
MainActivity.java
public class MainActivity extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取應用程序中的bn按鈕
		Button bn = (Button) findViewById(R.id.bn);
		// 為按鈕綁定事件監聽器。
		bn.setOnClickListener(new MyClickListener()); // ①
	}

	// 定義一個單擊事件的監聽器
	class MyClickListener implements View.OnClickListener
	{
		// 實現監聽器類必須實現的方法,該方法將會作為事件處理器
		@Override
		public void onClick(View v)
		{
			EditText txt = (EditText) findViewById(R.id.txt);
			txt.setText("bn按鈕被單擊了!");
		}
	}
}
基於監聽器的事件處理模型的編程步驟如下:

 

1,獲取普通界面組件(事件源),也就是被監聽的對象

2,實現時間監聽類,該監聽器類是一個特殊的Java類,必須實現一個XxxListener接口

3,調用事件源的setXXXListener方法,將事件監聽器對象注冊給普通組件(事件源)

 

事件監聽器必須實現事件監聽接口,Android的不同界面組件提供了不同的監聽器接口,這些接口通常以內部類的形式存在。以View類為例,包含如下監聽接口:

View.OnClickListener單擊事件的事件監聽器必須時間的接口

View.OnCreateContextMenuListener:創建上下文菜單時間的事件監聽器必須實現的接口

View.onFocusChangeListener:焦點改變事件的事件監聽器必須實現的接口

View.OnKeyListener:按鍵事件的時間監聽器必須實現的接口

所謂事件監聽器,其實就是實現了特定接口的java類的實例。在程序上一般有幾種形式:

1,內部類形式:將事件監聽器定義成當前類的內部類

 

public class EventQs extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取應用程序中的bn按鈕
		Button bn = (Button) findViewById(R.id.bn);
		// 為按鈕綁定事件監聽器。
		bn.setOnClickListener(new MyClickListener()); // 
	}

	// 定義一個單擊事件的監聽器,內部類形式
	class MyClickListener implements View.OnClickListener
	{
		// 實現監聽器類必須實現的方法,該方法將會作為事件處理器
		@Override
		public void onClick(View v)
		{
			EditText txt = (EditText) findViewById(R.id.txt);
			txt.setText("bn按鈕被單擊了!");
		}
	}
}
因為監聽器是內部類,所以可以自由訪問外部類的所有界面組件,這也是內部類的優勢。

 

2,外部類形式:將事件監聽器類定義成一個外部類

外部類形式的事件監聽器不能自由訪問創建GUI界面類的組件,使用時需要向監聽器類傳遞GUI界面類的組件的引用 ,所以用的比較少

MainActivity.java

 

public class MainActivity extends Activity
{
	EditText address;
	EditText content;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取頁面中收件人地址、短信內容
		address = (EditText)findViewById(R.id.address);
		content = (EditText)findViewById(R.id.content);
		Button bn = (Button)findViewById(R.id.send);
		bn.setOnLongClickListener(new SendSmsListener(
			this , address, content));//外部類形式,需要傳遞本類組件
	}
}
SendSmsListener.java

 

 

public class SendSmsListener implements OnLongClickListener
{
	private Activity act;
	private EditText address;
	private EditText content;

	public SendSmsListener(Activity act, EditText address
		, EditText content)
	{
		this.act = act;
		this.address = address;
		this.content = content;
	}

	@Override
	public boolean onLongClick(View source)
	{
		String addressStr = address.getText().toString();
		String contentStr = content.getText().toString();
		// 獲取短信管理器
		SmsManager smsManager = SmsManager.getDefault();
		// 創建發送短信的PendingIntent
		PendingIntent sentIntent = PendingIntent.getBroadcast(act
			, 0, new Intent(), 0);
		// 發送文本短信
		smsManager.sendTextMessage(addressStr, null, contentStr
			, sentIntent, null);
		Toast.makeText(act, "短信發送完成", Toast.LENGTH_LONG).show();
		return false;
	}
}

 

3,Activity本身作為事件監聽器類:讓Activity本身實現監聽接口,並實現事件處理器方法

 

// Activity實現事件監聽器接口
public class ActivityListener extends Activity
	implements OnClickListener
{
	EditText show;
	Button bn;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (EditText) findViewById(R.id.show);
		bn = (Button) findViewById(R.id.bn);
		// 直接使用Activity作為事件監聽器
		bn.setOnClickListener(this);
	}

	// 實現事件處理方法
	@Override
	public void onClick(View v)
	{
		show.setText("bn按鈕被單擊了!");
	}
}

 

4,匿名內部類形式:使用匿名內部類創建事件監聽器對象。代碼簡單的情況,只能用一次

 

public class MainActivity extends Activity
{
	EditText show;
	Button bn;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (EditText) findViewById(R.id.show);
		bn = (Button) findViewById(R.id.bn);
		// 直接使用Activity作為事件監聽器
		bn.setOnClickListener(new OnClickListener()
		{
			// 實現事件處理方法
			@Override
			public void onClick(View v)
			{
				show.setText("bn按鈕被單擊了!");
			}
		});
	}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved