Android用注解代替findViewByIdji1setContentView 注解初步了解
程序员文章站
2022-03-09 22:36:21
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声明