標籤:android style blog io ar 使用 sp for java
想必開發過android的都使用過一些 架構,然而架構裡都會使用一些,註解來協助我們,節省大量的代碼開發量。同時也使代碼更加的簡潔。
但是註解是通過java反射來實現的當然可能會犧牲掉一些效能。
以下是本人寫的一個較為簡單的繫結控制項,並且觸發其OnclickListem 事件。
//直接先看下註解方法。比較簡單,清晰
public class MainActivity extends FragmentActivity {<span style="white-space:pre"></span>//綁定對應的按鈕控制項,事件名稱為<span style="font-family: Arial, Helvetica, sans-serif;">onClickCallback</span>@InjectView(id = R.id.button1, clickMethod = "onClickCallback")private Button Button1;@Overrideprotected 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!)}//Binder 方法事件觸發管理類,管理類比較簡單,我簡單注釋了下。相信看起來容易了
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<Integer, String> listeners = new HashMap<Integer, String>(); //我們儲存著控制項ID以及方法名稱的關聯public OnEventListener(Activity activity) {// TODO Auto-generated constructor stubthis.activity=activity;}public OnEventListener() {}public OnEventListener setmClick(Integer id,String name) { //添加關聯,並返回監聽介面給View進行設定監聽// TODO Auto-generated method stublisteners.put(id, name);return this;}@Overridepublic void onClick(View v) { //當有事件觸發,則通過id去擷取對應的方法,傳遞參數給方法觸發對應的方法。即可// TODO Auto-generated method stubif(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(); }}}
Android IOC 之 註解繫結控制項 以及事件 案例 代碼簡單注釋講解