自定义注解
因为这里要用到反射知识,所以不熟悉反射的需要去复习下哦。
新建包injection,在包下定义注解类Id
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
/**
* 需要绑定的控件id
*
* @return
*/
int value();
}
再新建注解解析类FindView(注释详细,应该大家能看懂吧):
/**
* 注解获取Id解析类
* Created by Chao on 2017-12-23.
*/
public class FindView {
public static void bind(Object context) {
Activity at = null;
//判断传入的context实例
if (context instanceof Activity) {
at = (Activity) context;
} else if (context instanceof Fragment) {
Fragment fr = (Fragment) context;
at = fr.getActivity();
}
// 获取这个activity中的所有成员变量
Field[] fields = at.getClass().getDeclaredFields();
for (Field field : fields) {
// 获取该变量上面有没有打这个注解
Id mId = field.getAnnotation(Id.class);
if (mId != null) {// 有此注解
int id = mId.value();// 获取注解值
if (id != 0) {
field.setAccessible(true);
Object view = null;
try {
view = at.findViewById(id);// 根据注解ID在Activity布局查找控件
// 设置字段的属性
field.set(at, view);// 在at中将field变量设置值view
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
然后在BaseActivity中bind
private void init() {
FindView.bind(this);
initView();
initData();
initListener();
}
测试:
测试注解
模拟器展示
测试成功,以后我们只需要在我们的Activity控件加上@Id即可找到ID,当然控件监听也是一个道理,你们可以自己扩展哦。
源码地址:https://github.com/zhangzhichaolove/BasicsFrame
网友评论