android实现UI控件自动注入到Activity
16lz
2021-01-23
在写android程序里要获取UI控件,我们都必须在Activity通过findViewById()来获取各个UI控件。当然有很多第三方的框架都帮我们简化了这个操作(具体的不在这里介绍了),但本人都觉得还不够简单。因此决定自己写一个控件自动注入。
在android里,所有在layout里画出的控件你都可以定义一个唯一的ID。
然而所有的控件ID都会自动生成在android的R.java文件里。
public final class R { public static final class id { public static final int screenPic=0x7f080021; } }
这样我们就可以开始实现自动注入了,但前提有一个约定,即:Activity中的控件变量名必须与UI里面定义的ID一致。
我们可以先定义一个Activity的抽象类,在里面通过一段静态代码块来将R文件里的控件ID信息保存在内存中。
public abstract class PActivity extends Activity{ static{ Class rzz = R.id.class; //将所有的控件ID存放在内存中 for(Field f : rzz.getDeclaredFields()){ PActivity.cacheMap.put(f.getName(), f); } } //cacheMap保存R.id里面的所有ID信息 public static final Map cacheMap = new HashMap();}
接着我们可以重写onCreate方法
@Override protected final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { initUI(); init(); } catch (Exception e) { e.printStackTrace(); } } //用java反射来实现控件的自动注入 private void initUI() throws Exception{ Class clzz = this.getClass(); Field[] fields = clzz.getDeclaredFields(); for(Field f : fields){ int v = r(f.getName()); if(v!=0){ Object obj = this.findViewById(v);//控件自动注入 if(obj!=null){ f.setAccessible(true); f.set(this,obj); } } } } abstract protected void init() throws Exception;
现在我们来实际写一个Activity来看看实际的效果吧。
public abstract class TestActivity extends PActivity{ private ImageView screenPic; //替代onCreate方法 @Override protected void init() { //这里就可以直接使用screenPic System.out.println(screenPic); } @Override protected int getLayout() { // TODO Auto-generated method stub return R.layout.main_init; }}
更多相关文章
- Android 如何利用proc有上层想kernel写文件
- 仿微信、短信、QQ等消息数目右上角红色小圆球气泡显示(基于Androi
- Android运行时ART加载OAT文件的过程分析
- Android进阶自定义控件之滑动开关
- Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
- android之控件自定义(seekBar)
- Android 在onCreate()方法中获取控件宽高值为0解决方案
- 批量处理ios破解后的资源文件为android所用
- Android中ListView实现子控件点击事件后ListView点击事件失效解