android ViewId自动注解使用详解(ViewInject)

Annotation就是注解了,JDK1.5新增加功能,该功能可用于类,构造方法,成员变量,方法,参数等的声明中。

api版本23下,android studio里是直接可以使用的,不用添加依赖库,以前的api可能需要。下边介绍几种我觉得比较好用的注解。

NoNull注解

先看下源码

@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD})
public @interface NonNull {
}

@Retention(CLASS)指@NoNull编译到类文件里
@Target({METHOD, PARAMETER, FIELD})指应用于方法,参数和成员变量

再看具体使用


其中局部变量b 设置@NonNull是报错的 因为源码指明并不能应用于局部变量

  @NonNull  void testNonNull(@NonNull String a){
        @NonNull String b;
    }
    @NonNull String c;

CallSuper注解

首先还是先看源码

@Documented
@Retention(CLASS)
@Target({METHOD})
public @interface CallSuper {
}
标签说明: 编译时生效,应用于方法。
下边一起看下源码说明
/**
 * Denotes that any overriding methods should invoke this method as well.
 * <p>
 * Example:
 * <pre><code>
 *  @CallSuper
 *  public abstract void onFocusLost();
 * </code></pre>
 */

意指所有重写方法都需要调用super.method();

ViewId注解

看了一圈发现google并没有提供替换findViewById的注解方法,这里再介绍一下如何自定义注解方法。
首先效仿源码,创建注解类

@Target(ElementType.FIELD)//表示用在成员变量
@Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时生效
public @interface ViewInject {
    int value() default -1;//需要提供字段获取id值
}

核心逻辑就是定义注解接口,在特定时间,特定情况下执行我们预先写好的注解方法,已到达我们想要的效果。
注解执行方法

  /** 
     * 解析注解 
     */  
    public void autoInjectAllField() {  
        try {  
            Class<?> clazz = this.getClass();  
            Field[] fields = clazz.getDeclaredFields();//获得Activity中声明的字段  
            for (Field field : fields) {  
                // 查看这个字段是否有我们自定义的注解类标志的  
                if (field.isAnnotationPresent(ViewInject.class)) {  
                    ViewInject inject = field.getAnnotation(ViewInject.class);  
                    int id = inject.value();  
                    if (id > 0) {  
                        field.setAccessible(true);  
                        field.set(this, this.findViewById(id));//给我们要找的字段设置值  
                    }  
                }  
            }  
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();  
        }  
    }  

调用此方法时,要先初始化xml文件。所以在界面Activity中,必须在setContentView()执行后,才能调用父类的注解方法autoInjectAllField()

    @ViewInject(value=R.id.weightSum)
    Button a;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        autoInjectAllField();
        a.setText("成功");
    }









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风晴03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值