有时候提供的jar需要内嵌到第三方app,但是本身又使用到layout,drawable,string等资源,就需要用到动态获取资源id。

           比如原先我们设置页面是这样的

    setContentView(R.layout.main);    

          现在需要改成这样:


        Utils.setPackageName(getPackageName());
        Utils.setContext(getApplicationContext());

        setContentView(Utils.getResourceId(Utils.packageName, "layout",
                "chinapay_main"));    

	public static Context mContext = null;
/**
	 * 设置上下文.
	 * 
	 * @param name
	 *            包名
	 */
	public static void setContext(Context context) {
		mContext=context;
	}

/**
	 * 动态获取资源编号.
	 * 
	 * @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);
//				return field.getInt(cl);
				//20211026 某商户表示R做了内联,以上方法,无法找到资源,要求改用getResources方式
				return mContext.getResources().getIdentifier(instenceName,typeName,packageName);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return -1;
	}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐