android裡面,不管是layout,widget,drawable,string,color,array,style等等,android自動會在R.java裡面產生resouce ID。那如果只給你包名和widget id 或者string的name,你能得到產生的resouce ID,進而擷取這個view或者string嗎。實事是可以的。舉個栗子給大家看看。
/** * 得到資源檔. * * @param packageName * 包名 * @param typeName * 資源類型 * @param instenceName * 資源名 * @return int */ public static int getResourceId(String packageName, String typeName, String instenceName) { if (packageName != null && typeName != null && instenceName != null) { try { Class<?> cl = Class.forName(packageName + "$" + typeName); Field field = cl.getField(instenceName); Object obj = field.get(cl.newInstance()); return Integer.parseInt(obj.toString()); } catch (Exception e) { e.printStackTrace(); } } return -1; } 擷取string
Toast.makeText(this,getResources().getString(getResourceId("com.figo.study","string","cp_need_agree_protocol")), Toast.LENGTH_SHORT).show(); 擷取view
card_number = (TextView) findViewById(getResourceId("com.figo.study", "id", "tv_card_num")); 為什麼可以這麼做。是因為R.java裡面儲存了資源的resource id,而且是個內部靜態類,通過反射以後就可以擷取裡面的resouce id了,可以看看R.java是長怎麼樣的。
/* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */package com.figo.study;public final class R {public static final class anim {public static final int cpay_push_left_in = 0x7f040000;public static final int cpay_push_left_out = 0x7f040001;}public static final class array {public static final int cp_auth_idtype = 0x7f050000;}public static final class color {public static final int cp_light_white = 0x7f060000;public static final int cp_red = 0x7f060001;}public static final class dimen {public static final int dialog_prefered_width = 0x7f070000;}public static final class drawable {public static final int background_dialog = 0x7f020000;public static final int btn_submit_selector = 0x7f020001;}public static final class id {public static final int tv_card_num = 0x7f0a0038;public static final int btn_help = 0x7f0a0010;}public static final class layout {public static final int bosh_debitcard_auth = 0x7f030000;public static final int bosh_dialog_progress = 0x7f030001;}public static final class string {public static final int cp_need_agree_protocol = 0x7f080039;public static final int cpay_keyboard_letter = 0x7f080033;}public static final class style {public static final int AppBaseTheme = 0x7f090000;public static final int AppTheme = 0x7f090001;}}