知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
Android反射調(diào)用資源和id
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):42
本文介紹應(yīng)用反射調(diào)用資本和id
提出問題:
app有一種叫應(yīng)用墻的告白,應(yīng)用墻是在你的法度榜樣中彈出一個(gè)Activity來展示告白,比如豌豆廣點(diǎn)通等,集成的時(shí)刻須要將資本經(jīng)由過程復(fù)制添加到本身的項(xiàng)目中,然則app墻的代碼是封裝好的jar代碼。不是源碼,看不到,也不克不及修改。那么jar中的代碼是若何加載本地資本的呢?
[img]http://img.blog.csdn.net/20150106193513011?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzA0NTk3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
本身的項(xiàng)目中加載資本的時(shí)刻都是經(jīng)由過程本項(xiàng)目標(biāo)R文件來初始化資本,R文件是你本身的項(xiàng)目標(biāo)R文件,和項(xiàng)目有關(guān),如不雅第三方的jar文件中應(yīng)用的R是來第三方SDK項(xiàng)目中的資本R,代碼改換了項(xiàng)目之后鐵定了是找不到你復(fù)制過來的資本的。那么這時(shí)刻就須要經(jīng)由過程特別的方法來加載資本了,以便于調(diào)用在被集成的app中的資本。
經(jīng)由過程原始的java反射機(jī)制的方法調(diào)用資本:
這只是一種方法,還有其他的方法。
IDHelper.java
ResourceHelper.java
public class MainActivity extends ActionBarActivity { private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(IDHelper.getLayout(getApplicationContext(), "activity_main"));//字符串是layout文件的名字 initView(); } private void initView() { mButton = (Button) findViewById(IDHelper.getViewID( getApplicationContext(), "button1")); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Toast.makeText(getApplicationContext(), "HelloWorld", Toast.LENGTH_LONG).show();//字符串是控件的id } }); } }
public class ResourceHelper { private static ResourceHelper mResource = null; private static String mPackagename = null; private static Class<?> mLayout = null; private static Class<?> mDrawable = null; private static Class<?> mID = null; private static Class<?> mString = null; private static Class<?> mAttr = null; public static ResourceHelper getInstance(Context context) { if (mResource == null) { mPackagename = (mPackagename == null ? context.getPackageName() : mPackagename); mResource = new ResourceHelper(mPackagename); } return mResource; } public ResourceHelper(String packageName) { try { mLayout = Class.forName(packageName + ".R$layout"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { mDrawable = Class.forName(packageName + ".R$drawable"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { mID = Class.forName(packageName + ".R$id"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { mString = Class.forName(packageName + ".R$string"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { mAttr = Class.forName(packageName + ".R$attr"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private int getResourceId(Class<?> classType, String resourceName) { if (classType == null) { throw new IllegalArgumentException( "ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have " + mPackagename + ".R$* configured in obfuscation. field=" + resourceName); } try { Field field = classType.getField(resourceName); return field.getInt(resourceName); } catch (Exception e) { e.printStackTrace(); Log.e("ResourceHelper", "Error getting resource. Make sure you have copied all resources (res/) from SDK to your project."); } return -1; } // public int getDrawableId(String resourceName) { return getResourceId(mDrawable, resourceName); } public int getLayoutId(String resourceName) { return getResourceId(mLayout, resourceName); } public int getId(String resourceName) { return getResourceId(mID, resourceName); } public int getStringId(String resourceName) { return getResourceId(mString, resourceName); } public int getAttrId(String resourceName) { return getResourceId(mAttr, resourceName); } }
應(yīng)用的時(shí)刻不須要經(jīng)由過程R來調(diào)用資本
public class IDHelper { public static int getLayout(Context mContext, String layoutName) { return ResourceHelper.getInstance(mContext).getLayoutId(layoutName); } public static int getViewID(Context mContext, String IDName) { return ResourceHelper.getInstance(mContext).getId(IDName); } public static int getDrawable(Context context, String drawableName) { return ResourceHelper.getInstance(context).getDrawableId(drawableName); } public static int getAttr(Context context, String attrName) { return ResourceHelper.getInstance(context).getAttrId(attrName); } public static int getString(Context context, String stringName) { return ResourceHelper.getInstance(context).getStringId(stringName); } }
經(jīng)由過程Android API 的經(jīng)由過程反射獲取id的辦法
Context.getResources().getIdentifier("activity_main", "layout", paramContext.getPackageName());
應(yīng)用:
相關(guān)案例查看更多
相關(guān)閱讀
- 分銷系統(tǒng)
- 云南網(wǎng)站建設(shè)
- 小程序退款
- 網(wǎng)站開發(fā)公司哪家好
- 報(bào)廢車回收管理系統(tǒng)
- 云南軟件定制公司
- 云南小程序制作
- SEO
- 花農(nóng)小程序
- 楚雄網(wǎng)站建設(shè)公司
- 云南etc小程序
- 搜索排名
- 云南網(wǎng)站建設(shè)哪家好
- 大理小程序開發(fā)
- 網(wǎng)站建設(shè)優(yōu)化
- 云南小程序開發(fā)推薦
- 北京小程序開發(fā)
- 云南建設(shè)廳網(wǎng)站
- 云南省住房建設(shè)廳網(wǎng)站
- 南通小程序制作公司
- 網(wǎng)站上首頁
- 云南網(wǎng)站維護(hù)
- 網(wǎng)絡(luò)公司報(bào)價(jià)
- 百度小程序
- 小程序
- 網(wǎng)站建設(shè)首選公司
- 報(bào)廢車拆解回收管理系統(tǒng)
- 貴州小程序開發(fā)
- 云南網(wǎng)站開發(fā)
- 云南小程序開發(fā)首選品牌