接口控件初始化通常是在findViewByid中查找绑定,然后强制转换。 这项工作只是单纯的劳力,没有营养。 目前,许多开源类包都支持以评论的形式绑定控件
publicclasstestactivityextendsbaseactivity {
@ view inject (r.id.claim _ statement ) )。
私密webview mweb view;
}
但是,这种形式实际上编写了与findViewByid差别不大的代码。
习惯类的控件属性名称与xml的id名称相匹配,可以方便地在类和xml中进行对应搜索,初始化时复制&; 糊得也快
~
因此,既然控件名称与id匹配,那么可以直接从反射类的属性初始化控件,并不意味着初始化控件的过程可以大大省去
接下来直接坐代码
package com.gy.util;
导入安卓. view.view;
import java.lang.reflect.Field;
//*
*属性名称反射绑定控件
*创建by gy on 2016/3/16。
*/
公共类视图绑定器{
publicstaticfinalvoidbindviews (对象,视图福ot视图) {
if(object==null ) {
返回;
}
//获取对象中的所有属性-不包括父类的私有成员
field[]fields=getfields(object );
for(fieldfi:fields ) {
//确定属性是否从view继承
if (view.class.isassignablefrom (fi.gettype () ) )
//从属性名称中获取id
intid=foot view.get resources (.get identifier ) fi.getname )、' id '、footView.getContext ).getPackageName )。
if(id0 ) {
try {
找到//id时将控件绑定到相应的属性
fi.set (对象,footview.findviewbyid(id ) );
(匹配(illegalaccessexceptione ) ) ) )。
e .打印堆栈跟踪(;
}
}
}
}
}
公共静态字段[ ] get fields {
Field[] f1=o.getClass ().getDeclaredFields );
//设定为不检查访问
for(intI=0; i f1.length; I ) {
F1[I].setaccessible(true );
}
返回f1;
}
}
封装为活动
publicabstractclassbaseactivityextendsfragmentactivity {
@Override
publicvoidsetcontentview (intlayoutresid ) {
super.setcontentview (layout resid );
viewbindutil.bindviews(this,getWindow ) ).getDecorView );
}
@Override
公共语音内容视图(视图视图) {
super.setcontentview(view;
viewbindutil.bindviews(this,getWindow ) ).getDecorView );
}
}
如果继承了此activity,则可以省略绑定过程并直接使用
publicclassmainactivityextendsbaseactivity {
私密textview TV _ name;
@Override
protectedvoidoncreate (边界维护实例state )。
super.oncreate (savedinstancestate;
setcontentview (r.layout.activity _ main;
TV_name.settext('123 );
}
}
此方法适用于任何对象activity、fragment或listview自定义视图文件夹。 只要确保控件的属性名称和id匹配即可,如果id不匹配,也可以手动绑定