使用自定义注解来简化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); } }