Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android IOC 之 注解綁定控件 以及事件 事例 代碼簡單注釋講解

Android IOC 之 注解綁定控件 以及事件 事例 代碼簡單注釋講解

編輯:關於Android編程


想必開發過android的都使用過一些 框架,然而框架裡都會使用一些,注解來幫助我們,節省大量的代碼開發量。同時也使代碼更加的簡潔。

但是注解是通過java反射來實現的當然可能會犧牲掉一些性能。

以下是本人寫的一個較為簡單的綁定控件,並且觸發其OnclickListem 事件。


//直接先看下注解方法。比較簡單,清晰

public class MainActivity extends FragmentActivity {

	//綁定對應的按鈕控件,事件名稱為onClickCallback

	@InjectView(id = R.id.button1, clickMethod = "onClickCallback")
	private Button Button1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		UIBindUtil.bind(this);//初始化綁定
	}

	@ClickMethod(R.id.button1)
	public void onClickCallback(View view) {//觸發的事件
		Toast.makeText(MainActivity.this, "我是注解", 1).show();
	}

}


//接下來是綁定的初始化類

package com.ferris.ioc;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.app.Activity;
public class UIBindUtil {

	/**
	 * 綁定初始化各個空間的屬性以及事件
	 * @param activity
	 */
	public static void bind(Activity activity) {
		Class cl = activity.getClass();
		bindViews(activity, cl);
		bindMethods(activity, cl);
	}
	
	
	/**
	 *  為按鈕綁定對應的事件方法
	 * @param activity
	 * @param cl
	 */
	private static void bindMethods(Activity activity, Class cl) {
		for (Method method : cl.getDeclaredMethods()) {
			ClickMethod oc = method.getAnnotation(ClickMethod.class);
			if (oc != null) {
				int ids[] = oc.value();
				for (int id : ids) {
					OnEventListener listener = new OnEventListener(activity)
					.setmClick(id,method.getName());
					activity.findViewById(id).setOnClickListener(listener);
				}
			}
		}
	}
	/**
	 *  初始化按鈕
	 * @param activity
	 * @param cl
	 */
	private static void bindViews(Activity activity, Class cl) {
		try {
			for (Field field : cl.getDeclaredFields()) {
				InjectView av = field.getAnnotation(InjectView.class);
				if (av != null) {
					field.setAccessible(true);
					setView(field, activity, av.id());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	private static void setView(Field view, Activity activity, int id)
			throws IllegalArgumentException, IllegalAccessException {
		view.set(activity, activity.findViewById(id));
	}
	

}

//點擊方法的注入類

package com.ferris.ioc;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ClickMethod {
	int[] value() default {};
}


//綁定控件ID的注入類
package com.ferris.ioc;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
    public int id();
    public String clickMethod() default ""; // 點擊回調方法(方法參數必須只有一個View!)
}
//綁定方法事件觸發管理類,管理類比較簡單,我簡單注釋了下。相信看起來容易了
package com.ferris.ioc;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;

@SuppressLint("UseSparseArrays")
public class OnEventListener implements OnClickListener{
	private Activity activity;
	private static Map listeners = new HashMap(); //我們保存著控件ID以及方法名稱的關聯
	public OnEventListener(Activity activity) {
		// TODO Auto-generated constructor stub
		this.activity=activity;
	}

	public OnEventListener() {

	}
	
	public OnEventListener setmClick(Integer id,String name) {  //添加關聯,並返回監聽接口給View進行設置監聽
		// TODO Auto-generated method stub
		listeners.put(id, name);
		return this;
	}

	
	@Override
	public void onClick(View v) {  //當有事件觸發,則通過id去獲取對應的方法,傳遞參數給方法觸發對應的方法。即可
		// TODO Auto-generated method stub
		if(listeners==null||listeners.size()<=0){
			return;
		}
		
		String methodName=listeners.get(v.getId());
		if(TextUtils.isEmpty(methodName)){
			return;
		}
		  try {
			   //通過類去查找對應的方法以及參數類型
	            Method callbackMethod = activity.getClass().getDeclaredMethod(methodName, View.class);
	            callbackMethod.setAccessible(true);
	            //傳遞對應的參數過去
	            callbackMethod.invoke(activity, v);
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	}

	
}






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