使用自定义注解来简化findViewById查找视图的操作 【转】
版权声明:
本文为博主学习过程中整理发布,如有侵权请告知
更新时间:
2017-10-19 10:59:41
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
简化查找控件代码
有时一个activity中有10个以上的控件时初始化时要先定义然后再查找赋值很是麻烦,简化后我们在activity中使用控件的实例时只要一个注解加一个声明就可以使用啦,如下
@ViewInject(R.id.buy) private Button buy;
自定义一个注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject{
int value();
}关联处理注解
注解只是单单的添加上去没有任何效果,还需要一个类来处理带这些注解的代码如下
public class AnnotateUtils {
public static void injectViews(Activity activity) {
Class<? extends Activity> object = activity.getClass(); // 获取activity的Class
Field[] fields = object.getDeclaredFields(); // 通过Class获取activity的所有字段
for (Field field : fields) { // 遍历所有字段
// 获取字段的注解,如果没有ViewInject注解,则返回null
ViewInject viewInject = field.getAnnotation(ViewInject.class);
if (viewInject != null) {
int viewId = viewInject.value(); // 获取字段注解的参数,这就是我们传进去控件Id
if (viewId != -1) {
try {
// 获取类中的findViewById方法,参数为int
Method method = object.getMethod("findViewById", int.class);
// 执行该方法,返回一个Object类型的View实例
Object resView = method.invoke(activity, viewId);
field.setAccessible(true);
// 把字段的值设置为该View的实例
field.set(activity, resView);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
}在MainActivity中的使用方法
public class MainActivity extends Activity {
@ViewInject(R.id.buy)
private Button buy;
@ViewInject(R.id.money)
private TextView money;
@ViewInject(R.id.tv_power)
private TextView power;
@ViewInject(R.id.tv_life)
private TextView life;
@ViewInject(R.id.tv_dex)
private TextView dex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用下面这一行来初始化注解对象
AnnotateUtils.injectViews(this);
}
}