使用自定义注解来简化findViewById查找视图的操作 【转】

来源:赵克立博客 分类: Android 标签:Android发布时间:2017-10-19 10:55:36最后更新:2017-10-19 10:59:41浏览:1739
版权声明:
本文为博主学习过程中整理发布,如有侵权请告知
更新时间:
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);
    }
}



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python