自己動手打造IOC框架,模仿xutils

屬性注解

注解ViewById運行時注解,value就是R.id.xx

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewById {
    int value();
}

ViewFinder view的幫助類,findviewById

public class ViewFinder {
    Activity mActivity;
    View mView;
    public ViewFinder(Activity activity) {
        this.mActivity=activity;
    }

    public ViewFinder(View view) {
        this.mView=view;
    }
    public View findViewById(int viewId){
        return mActivity!=null?mActivity.findViewById(viewId):mView.findViewById(viewId);
    }
}

ViewUtils用于與Activity進行直接交互

public class ViewUtils {
    public static void inject(Activity activity) {
        inject(new ViewFinder(activity), activity);
    }

    public static void inject(View view) {
        inject(new ViewFinder(view), view);
    }

    public static void inject(View view, Object object) {
        inject(new ViewFinder(view), object);
    }

    private static void inject(ViewFinder finder, Object object) {
        injectField(finder, object);
    }

    //獲得注入屬性
    private static void injectField(ViewFinder finder, Object object) {
        //1.獲得反射的類
        Class<?> clazz = object.getClass();
        //2.獲得所有屬性
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            //獲得添加注解的屬性
            ViewById viewById = field.getAnnotation(ViewById.class);
            if (viewById != null) {
                //獲得注解上面的值    R.id,test
                int value = viewById.value();
                //獲得view  view->mTextTv
                View view = finder.findViewById(value);
                if (view != null) {
                    //私有的共有的都可以
                    field.setAccessible(true);
                    try {
                        //將view設置 mTextTv
                        field.set(object, view);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}


事件注解注入

  //事件注入
    private static void injectEvent(ViewFinder finder, Object object) {
        //1.獲得所有的方法
        Class<?> clazz = object.getClass();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            OnClick onClick = method.getAnnotation(OnClick.class);
            if (onClick != null) {
                int[] viewIds = onClick.value();
                for (int viewId : viewIds) {
                    View view = finder.findViewById(viewId);
                    if (view != null)
                        view.setOnClickListener(new DeclaredOnClickListener(method, object));
                }
            }
        }
    }
    private static class DeclaredOnClickListener implements View.OnClickListener {
        Method mMethod;
        Object mObject;

        public DeclaredOnClickListener(Method method, Object object) {
            this.mMethod = method;
            this.mObject = object;
        }

        @Override
        public void onClick(View v) {
            mMethod.setAccessible(true);
            try {
                mMethod.invoke(mObject, v);
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    mMethod.invoke(mObject, null);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }

            }
        }
    }

自動檢測網(wǎng)絡擴展

CheckNet注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckNet {
}

修改事件的注入

  //事件注入
    private static void injectEvent(ViewFinder finder, Object object) {
        //1.獲得所有的方法
        Class<?> clazz = object.getClass();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            OnClick onClick = method.getAnnotation(OnClick.class);
            if (onClick != null) {
                int[] viewIds = onClick.value();
                for (int viewId : viewIds) {
                    View view = finder.findViewById(viewId);
                    //擴展判斷是否有網(wǎng)
                    boolean isCheckNet = method.getAnnotation(CheckNet.class) != null;
                    if (view != null) {
                        view.setOnClickListener(new DeclaredOnClickListener(method, object, isCheckNet));
                    }

                }
            }
        }
    }

    private static class DeclaredOnClickListener implements View.OnClickListener {
        Method mMethod;
        Object mObject;
        boolean mIsCheckNet;

        public DeclaredOnClickListener(Method method, Object object, boolean isCheckNet) {
            this.mMethod = method;
            this.mObject = object;
            this.mIsCheckNet = isCheckNet;
        }

        @Override
        public void onClick(View v) {
            // 需不需要檢測網(wǎng)絡
            if (mIsCheckNet) {
                // 需要
                if (!networkAvailable(v.getContext())) {
                    Toast.makeText(v.getContext(), "親,您的網(wǎng)絡不太給力", Toast.LENGTH_LONG).show();
                    return;
                }
            }

            try {
                mMethod.setAccessible(true);
                mMethod.invoke(mObject, v);
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    mMethod.invoke(mObject, null);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }

            }
        }
    }

    /**
     * 判斷當前網(wǎng)絡是否可用
     */
    private static boolean networkAvailable(Context context) {
        // 得到連接管理器對象
        try {
            ConnectivityManager connectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = connectivityManager
                    .getActiveNetworkInfo();
            if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容