package com.kull.android; import java.lang.reflect.Field; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; import android.content.Context; import com.kull.ObjectHelper; public class RHelper { public enum RType{ id,attr,style, layout,menu,string, color,dimen,anim, drawable,styleable; } private static Map<String, Integer> CACHE_IDS=new HashMap<String, Integer>(); private static Map<String, Integer[]> CACHE_IDARRAYS=new HashMap<String, Integer[]>(); //private static Map<RType,Map<String, Integer>> IDS=new HashMap<RType,Map<String, Integer>>(); private static boolean hasInited=false; public static void init(Class... clsRs) throws Exception{ if(hasInited)return; for(Class clsR :clsRs){ if(!"R".equals(clsR.getSimpleName())){ throw new Exception("this class must be R"); } Class[] clss= clsR.getDeclaredClasses(); for(RType rType :RType.values()){ //IDS.put(rType, new HashMap<String, Integer>()); for(Class cls :clss){ String clsName=cls.getSimpleName(); if(!clsName.equals(rType.name()))continue; Field[] fields=cls.getDeclaredFields(); for(Field field :fields){ String fname=field.getName(); String key=getKey(rType, fname); Type ft=field.getType(); if(Integer.class.equals(ft)){ CACHE_IDS.put(key, field.getInt(cls)); }else if(Integer[].class.equals(ft)){ CACHE_IDARRAYS.put(key, (Integer[])field.get(cls)); } } } } } } private static String getKey(RType rtype,String name){ return rtype.name()+":"+name; } public static int getResourceIdByName(RType rtype,String name) throws NullPointerException{ String key=getKey(rtype, name); if(CACHE_IDS.containsKey(key)){ return CACHE_IDS.get(key); }else throw new NullPointerException(rtype.name()+":"+name+" is not exist"); } public static int getResourceIdByName(String name)throws NullPointerException{ for(RType rtype :RType.values()){ String key=getKey(rtype, name); if(CACHE_IDS.containsKey(key)){ return CACHE_IDS.get(key); } } throw new NullPointerException(name+" is not exist"); } public static int getResourceByKey(String key) throws NullPointerException{ if(CACHE_IDS.containsKey(key)){ return CACHE_IDS.get(key); }else throw new NullPointerException(key+" is not exist"); } public static String getString(Context context, String name){ String key=getKey(RType.string, name); if(CACHE_IDS.containsKey(key)){ return context.getString(CACHE_IDS.get(key)); }else throw new NullPointerException(name+" is not exist"); } }