简单的安卓IOC,免去findViewById

在我们开发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


 
    
 
        
 
        
 
        
 
    
     
    
 
        
        
        
        
        
        
    
     
    
 
    
     
    
    

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同僚互相交流,也希望能为有需求的朋友解决困难,

邮箱:[email protected]


你可能感兴趣的:(简单之美)