美文网首页
Android-简单IOC框架

Android-简单IOC框架

作者: 大风车__ | 来源:发表于2019-12-12 11:29 被阅读0次

    ContentView注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME) //一直保留到加载虚拟机中
    //@Retention(RetentionPolicy.CLASS) //编译到字节码中,当虚拟机加载这个字节码时,注解信息会被清除
    //@Retention(RetentionPolicy.SOURCE) //只会在源码出现,当源码编译成字节码时,注解信息会被清除
    public @interface ContentView {
        int value();
    }
    

    ViewInject注解

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

    OnClick注解

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

    绑定

    public class ViewInjector {
    
        public static void bind(Activity activity) {
            injectLayout(activity);
            injectView(activity);
            injectEvents(activity);
        }
    
        /*绑定ContentView*/
        private static void injectLayout(Activity activity) {
            Class<?> clazz = activity.getClass();
            ContentView inject = clazz.getAnnotation(ContentView.class);
            if (inject != null) {
                int id = inject.value();
                try {
                    Method setContentView = clazz.getMethod("setContentView", int.class);
                    setContentView.invoke(activity, id);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /*绑定ViewInject*/
        private static void injectView(Activity activity) {
            Class<?> clazz = activity.getClass();
            Field[] declaredFields = clazz.getDeclaredFields();
            for (int i = 0; i < declaredFields.length; i++) {
                Field field = declaredFields[i];
                ViewInject inject = field.getAnnotation(ViewInject.class);
                if (inject != null) {
                    int id = inject.value();
                    try {
                        Method findViewById = clazz.getMethod("findViewById", int.class);
                        View view = (View) findViewById.invoke(activity, id);
                        field.setAccessible(true);
                        field.set(activity, view);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        /*绑定OnClick*/
        private static void injectEvents(final Activity activity) {
            Class<?> clazz = activity.getClass();
            Method[] methods = clazz.getDeclaredMethods();
            for (final Method method : methods) {
                OnClick onClick = method.getAnnotation(OnClick.class);
                if (onClick != null) {
                    int[] ids = onClick.value();
                    for (int id : ids) {
                        final View view = activity.findViewById(id);
                        if(view != null){
                            view.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    method.setAccessible(true);
                                    try {
                                        method.invoke(activity, view);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            }); 
                        }
                    }
                }
            }
        }
    }
    

    测试

    @ContentView(R.layout.activity_main)
    public class MainActivity extends AppCompatActivity {
    
        @ViewInject(R.id.btn_test1)
        Button btn1;
    
        @ViewInject(R.id.btn_test2)
        Button btn2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ViewInjector.bind(this);
        }
    
        @OnClick({R.id.btn_test1, R.id.btn_test2})
        public void onClick(View view) {
           System.out.println(this);
            if (view == btn1) {
                Toast.makeText(MainActivity.this, "点击了btn1", Toast.LENGTH_SHORT).show();
            }
            if (view == btn2) {
                Toast.makeText(MainActivity.this, "点击了btn2", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Android-简单IOC框架

          本文链接:https://www.haomeiwen.com/subject/mrgzgctx.html