标签:
在我们开发android项目的时候,findViewById是使用最频繁且最无技术含量的代码,在比较复杂的UI结构里这将是个比较繁琐耗时的操作;那么我们有没有什么比较好的方法来规避这个操作呢?答案当时是肯定的,例如目前的框架thinkAndroid,可以通过注解的方式来完成UI控件的IOC操作。
这里小弟利用JAVA的反射技术写了一个简单且方便的IOC小程序,下面来给大家介绍一下:
1、android中所有的控件都会有一个ID属性,且这个属性会被注册在R.id中,那么我们就从R.id开始动手脚吧。
private void reflectR(){
Class rzz = R.id.class;
for(Field f : rzz.getDeclaredFields()){
//Data.cacheMap为一个HashMap对象
Data.cacheMap.put(f.getName(), f);
}
}
以上这段代码,我们就把整个项目的R.id全都以key-value的方式存放在了一个全局的HashMap对象中。
2、下面我们看看如何来实现IOC吧。
layout:test.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout android:id="@+id/titleBar" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/leftbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerInParent="false" android:layout_centerVertical="true" android:layout_gravity="left" android:src="@drawable/back" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/rightbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> <LinearLayout android:id="@+id/tmp1" android:layout_below="@id/titleBar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:id="@+id/hj" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <LinearLayout android:id="@+id/line1" android:layout_width="fill_parent" android:layout_height="5dp"/> </LinearLayout> <LinearLayout android:id="@+id/by" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <LinearLayout android:id="@+id/line2" android:layout_width="fill_parent" android:layout_height="5dp"/> </LinearLayout> </LinearLayout> <LinearLayout android:id="@+id/tmp2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/tmp1" android:orientation="horizontal" > </LinearLayout> <ListView android:id="@+id/listView" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_below="@id/tmp2"> </ListView> </RelativeLayout>
public class Test extends Activity { //控件变量的定义名称,必须与layout中的Id一致 private LinearLayout hj,by,line1,line2; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(this.getLayout()); //开始IOC自动注入控件 this.iocElement(); //下借来你就可以直接使用控件了,并不需要findViewById } protected int getLayout() { return R.layout.test; } /** * 对符合自动注入规范的控件进行注入 * 该方法的实现采取的Java反射原理 * 免除了繁琐重复的findViewById(...)操作 * @throws Exception */ private void iocElement() throws Exception{ Class clzz = this.getClass(); Field[] fields = clzz.getDeclaredFields(); for(Field f : fields){ int v = r(d+f.getName()); if(v!=0){ Object obj = this.findViewById(v); if(obj!=null){ f.setAccessible(true); f.set(this,obj); } } } } /** * 在HashMap中判断R.id中是否有该变量,有则返回改ID * @param fieldName * @return * @throws Exception */ private static int r(String fieldName) throws Exception{ if(Data.cacheMap.get(fieldName)!=null){ Field f = (Field)Data.cacheMap.get(fieldName); return f.getInt(null); }else{ return 0; } } }
很简单的IOC程序,希望能为大家的android代码带来一点点方便!
以下是本人的QQ邮箱,希望可以和IT同僚互相交流,也希望能为有需求的朋友解决困难,
邮箱:490661383@qq.com
标签:
原文地址:http://www.cnblogs.com/shadowdance/p/4693229.html