Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android View的onClick回調機制

Android View的onClick回調機制

編輯:關於Android編程

本文將解析Android View的onClick事件的回調機制,通過這個設計,可以明白接口和對象組合是非常重要的。記得我們在寫Button的onClick事件是往往會這樣來寫:

button.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
				
	}
});


為什麼要這樣寫呢?我在點擊button時為什麼能調用到Override的onClick方法? 如果java面向對象基礎沒學好的話,還真是想不明白,比如像我一樣。不得不看源碼才知道,到底是怎樣一會事兒。穿梭在源碼中是件非常快樂的事情,第一:SDK編碼風格很規范,看起來舒坦!第二:注釋寫得很精。好現在來分析一下是怎麼實現回調的,這裡我就用我寫的一個小程序來說明:

首先定義個類,姑且就叫它BaseView,跟Android SDK裡面的View對應

package com.example.callbacktest;

public class BaseView {
	interface OnClickMyListener {
		public void onClick(BaseView view);
	};
}
該類裡面有個內部接口,叫OnClickMyListener在,這與Android SDK中OnClickListener對應。接下來寫兩個BaseView的子類ViewA、ViewB

package com.example.callbacktest;

public class ViewA extends BaseView{
	private OnClickMyListener mLinstener ;
	
	public void click(){
		mLinstener.onClick(this);
	}
	
	public void setOnClickMyListener(OnClickMyListener linstener){
		mLinstener = linstener ;
	}
}

package com.example.callbacktest;

public class ViewB extends BaseView{
	private OnClickMyListener mLinstener ;
	
	public void click(){
		mLinstener.onClick(this);
	}
	
	public void setOnClickMyListener(OnClickMyListener linstener){
		mLinstener = linstener ;
	}
}


在主類中這樣來調用:

package com.example.callbacktest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ViewA viewA = new ViewA();
		ViewB viewB = new ViewB();
		
		viewA.setOnClickMyListener(new BaseView.OnClickMyListener() {
			@Override
			public void onClick(BaseView view) {
				Log.e("MainActivity","viewA-->onClick");
			}
		});
		
		viewB.setOnClickMyListener(new BaseView.OnClickMyListener() {
			@Override
			public void onClick(BaseView view) {
				Log.e("MainActivity","viewB-->onClick");
			}
		});
		
		Log.e("MainActivity","now click A:");
		viewA.click();
		Log.e("MainActivity","now click B:");
		viewB.click();
	}
}

現在來說一下這個流程,首先在View中定義一個接口,接口中的方法就是回調方法,即onClick(BaseView view),這個方法的參數是BaseView類型,也就是說凡是繼承自BaseView的子類並且需要用這個接口來實例化回調監聽器的類都可以響應這個回調方法。就像這裡的ViewA、ViewB一樣,這相當於Android SDK裡面的Button或ImageView等等,他們都是繼承自View,並且需要OnClickListener去實例化onClick事件監聽器。

這裡的ViewA、ViewB有自己的click方法,這個方法按理由來說不應該在主程序中主動調用,這個方法應該是屏幕捕捉到一個點擊屏幕的動作之後轉換成坐標,如果這個坐標對應的是該View,那麼才調用它的click方法,也就是說是屏幕獲取點擊事件,來觸發View的click事件,進而調用了事件監聽器的onClick方法,而onClick方法是在外部實現的,所以就會調用onClick裡面的打印信息。這就是整個調用的流程。



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved