Android IOC 之 註解繫結控制項 以及事件 案例 代碼簡單注釋講解

來源:互聯網
上載者:User

標籤: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 之 註解繫結控制項 以及事件 案例 代碼簡單注釋講解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.