概述
本文主要分享基于注解和反射实现控件注入。
实现思路:
- 自定义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
网友评论