欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android用注解代替findViewByIdji1setContentView 注解初步了解

程序员文章站 2022-07-04 11:01:25
android用注解代替findviewbyidji1setcontentview 注解初步了解 @target(elementtype.field) @retention(retentionpol...

android用注解代替findviewbyidji1setcontentview 注解初步了解

@target(elementtype.field) @retention(retentionpolicy.runtime) public @interface injectview { //id就是控件id,在某一个控件上使用注解标注其id int id() default -1; }

public class mainactivity extends activity { public static final string tag=mainactivity; //标注textview的id @injectview(id=r.id.tv_img) private textview mtext; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); try { autoinjectallfield(this); } catch (illegalaccessexception e) { } catch (illegalargumentexception e) { } if(mtext!=null) mtext.settext(hello gavin); } public void autoinjectallfield(activity activity) throws illegalaccessexception, illegalargumentexception { //得到activity对应的class class clazz=this.getclass(); //得到该activity的所有字段 field []fields=clazz.getdeclaredfields(); log.v(tag, fields size-->+fields.length); for(field field :fields) { //判断字段是否标注injectview if(field.isannotationpresent(injectview.class)) { log.v(tag, is injectview); //如果标注了,就获得它的id injectview inject=field.getannotation(injectview.class); int id=inject.id(); log.v(tag, id--->+id); if(id>0) { //反射访问私有成员,必须加上这句 field.setaccessible(true); //然后对这个属性复制 field.set(activity, activity.findviewbyid(id)); } } } } 代码很通俗易懂,一下子就可以让人学会注解。所以借鉴他的,我写了下,代替setcontentview的注解
@target(elementtype.type)
@retention(retentionpolicy.runtime)
public @interface layoutid {
    int id() default -1;
}
@layoutid(id = r.layout.activity_main)
public class mainactivity extends appcompatactivity {

    private static final string tag = "xbh";

    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(this.getclass().getannotation(layoutid.class).id());
    }
}
之所以想这样做,就是为了在有base类的时候,看起来更加的清爽

子类

@layoutid(id = r.layout.activity_main)
public class mainactivity extends baseactivity {

}
父类
@suppresslint("registered")
public class baseactivity extends appcompatactivity{

    private static final string tag = "xbh";

    @override
    protected void oncreate(@nullable bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(this.getclass().getannotation(layoutid.class).id());
    }
}
这样写,简直美的人心醉,啥都没有,就成功弄出了一个activity。

解释下注解的定义

@target(elementtype.type)
注解的使用在什么地方主要是决定在@targe这个元注解上作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(elementtype)有:
1.constructor:用于描述构造器
2.field:用于描述域
3.local_variable:用于描述局部变量
4.method:用于描述方法
5.package:用于描述包
6.parameter:用于描述参数
7.type:用于描述类、接口(包括注解类型) 或enum声明