反射与注解实现控件注入

2020-07-19  本文已影响0人  昊空_6f4f

概述

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

实现思路:

自定义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

上一篇 下一篇

猜你喜欢

热点阅读