android 自动初始化控件 不用注解不用findViewByid
2016-03-30 21:45
681 查看
界面控件的初始化一般通过 findViewByid 来查找绑定再强制转换,这项工作只是个纯体力活没有任何营养,现在有很多开源类包支持通过注解的形式来绑定控件类似这样
但是这种形式其实编写的代码量跟findViewByid相差无几。
因为习惯类中控件属性名跟xml中id名保持一致,这样可以很方便在类与xml中对应查找,初始化的时候复制粘贴也快
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/899229cfab2c02d614490485cabb781b.gif)
~
所以我想既然控件名跟id一致那可以直接通过反射类中属性来初始化控件不是可以省掉一大段初始化控件的过程
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/4ea38101608645b64e3ba76e93a6ce02.gif)
下面直接上代码
封装到activity中
这样只要继承这个activity就能省去绑定过程直接使用了
这个方法可以适用于任何对象activity,fragment或者listview自定义的viewholder,只要保证控件的属性名与id一致即可,id不一致的时候还是可以手动绑定的
public class TestActivity extends BaseActivity { @ViewInject(R.id.claim_statement) private WebView mWebView; }
但是这种形式其实编写的代码量跟findViewByid相差无几。
因为习惯类中控件属性名跟xml中id名保持一致,这样可以很方便在类与xml中对应查找,初始化的时候复制粘贴也快
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/899229cfab2c02d614490485cabb781b.gif)
~
所以我想既然控件名跟id一致那可以直接通过反射类中属性来初始化控件不是可以省掉一大段初始化控件的过程
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/4ea38101608645b64e3ba76e93a6ce02.gif)
下面直接上代码
package com.gy.util; import android.view.View; import java.lang.reflect.Field; /** * 属性名反射绑定控件 * Created by gy on 2016/3/16. */ public class ViewBindUtil { public static final void bindViews(Object object, View footView) { if(object == null) { return; } //获取对象中所有属性-不包含父类私有成员 Field[] fields = getFields(object); for(Field fi : fields) { //判断属性是否继承自view if(View.class.isAssignableFrom(fi.getType())) { //根据属性名获取id int id = footView.getResources().getIdentifier(fi.getName(), "id", footView.getContext().getPackageName()); if(id > 0) { try { //查找到id时绑定控件到对应属性上 fi.set(object, footView.findViewById(id)); } catch(IllegalAccessException e) { e.printStackTrace(); } } } } } public static Field[] getFields(Object o) { Field[] f1 = o.getClass().getDeclaredFields(); // 设置不检查访问 for(int i = 0; i < f1.length; i++) { f1[i].setAccessible(true); } return f1; } }
封装到activity中
public abstract class BaseActivity extends FragmentActivity { @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); ViewBindUtil.bindViews(this, getWindow().getDecorView()); } @Override public void setContentView(View view) { super.setContentView(view); ViewBindUtil.bindViews(this, getWindow().getDecorView()); } }
这样只要继承这个activity就能省去绑定过程直接使用了
public class MainActivity extends BaseActivity { private TextView tv_name; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_name.setText("123"); } }
这个方法可以适用于任何对象activity,fragment或者listview自定义的viewholder,只要保证控件的属性名与id一致即可,id不一致的时候还是可以手动绑定的
相关文章推荐
- android学习记录
- android 开发文档模板【新浪云搬运】
- android插上耳机仍用扬声器播放音频【新浪云搬运】
- Android学习(3) -- Android虚拟机
- Android中pendingIntent的深入理解
- Xamarin.android Intent传递对象
- android唤醒屏幕并解锁【新浪云搬运】
- Android中ListView分页加载数据
- Android之Intent深入
- 【Android】通用系列 —— 下拉刷新之继承ListView的下拉刷新
- AndroidStudio项目交付(更新)到github最详细步骤
- Android内存泄漏的各种原因详解
- android开发中bitmap图片占用内存计算方法
- 关于对Android Activity 生命周期的7个方法的理解
- Android ViewPager使用记录
- Android EditText取消焦点并关闭输入法【从新浪云搬运】
- android优化(json工具,message新建/传递,avtivity深入学习视频)
- android实现tab切换效果
- ubuntu 14.04系统 Android 4.0.1 源码编译过程
- Android学习--AsyncTask工具