美文网首页
反射与注解实现控件注入

反射与注解实现控件注入

作者: 昊空_6f4f | 来源:发表于2020-07-19 11:27 被阅读0次

    概述

    本文主要分享基于注解和反射实现控件注入。

    实现思路:

    • 自定义BindView注解标记需要注入的控件
    • 查找页面中带BindView注解的属性
    • 根据BindView注解获取控件Id,查找Id对应的View并使用反射对属性赋值

    自定义BindView注解

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface BindView {
    
        //IdRes用于语法检查
        @IdRes int value();
    }
    

    查找页面中带BindView注解的属性并使用反射赋值

    关键代码如下:

    public static void inject(Activity activity) {
    
        try {
            Class<? extends Activity> activityClass = activity.getClass();
    
            //查处Activity中的所有属性
            Field[] fields = activityClass.getDeclaredFields();
    
            for (Field field : fields) {
                //判断属性是否有BindView注解
                if (field.isAnnotationPresent(BindView.class)) {
                    //获取BindView注解
                    BindView bindView = field.getAnnotation(BindView.class);
                    //获取注解的值
                    int value = bindView.value();
                    //查找到对应的控件
                    View view = activity.findViewById(value);
                    //设置访问权限
                    field.setAccessible(true);
                    //反射实现控件初始化
                    field.set(activity,view);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    页面注入

    public class MainActivity extends AppCompatActivity {
    
        @BindView(R.id.textView)
        TextView textView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            InjectUtils.inject(this);
            textView.setText("fmt");
        }
    }
    

    完整代码实现

    百度链接
    密码:7pz0

    相关文章

      网友评论

          本文标题:反射与注解实现控件注入

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