反射与注解实现控件注入

概述

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

实现思路:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容