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

反射与注解实现控件注入

作者: 昊空_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