2014-09-19 43 views

回答

1

这可以使用反射。但请注意,以下方法不会考虑具有相同值的资源。

private String getStringResourceName(String s) 
{ 
    for(Field f : R.string.class.getFields()) 
    { 
     try 
     { 
      int id = f.getInt(null); 
      if(getResources().getString(id).equals(s)) 
       return f.getName(); 
     } 
     catch (Exception e) 
     { 
      // ignore 
     } 
    } 

    return null; 
} 

,我想出了一个办法让资源名称从外部封装的字符串值。在以下方法中,第一个参数是包名 - 例如com.mycompany.myapp - 第二个是您正在搜索的字符串值。如果搜索以任何方式失败,此方法将返回null。

private String getExternalStringResourceName(String packageName, String resValue) 
{ 
    PackageManager pm = getPackageManager(); 

    try 
    { 
     Resources extRes = pm.getResourcesForApplication(packageName); 

     String apkName = getPackageManager().getPackageInfo(packageName, 0).applicationInfo.sourceDir; 
     PathClassLoader pcl = new PathClassLoader(apkName, ClassLoader.getSystemClassLoader()); 
     Class resCls = pcl.loadClass(packageName + ".R"); 

     Class strCls = null; 
     for (Class cls : resCls.getClasses()) 
     { 
      if (cls.getSimpleName().equals("string")) 
      { 
       strCls = cls; 
       break; 
      } 
     } 

     if (strCls == null) 
      return null; 

     for (Field f : strCls.getFields()) 
     { 
      try 
      { 
       int id = f.getInt(null); 
       if (extRes.getString(id).equals(resValue)) 
        return f.getName(); 
      } 
      catch (Resources.NotFoundException e) 
      {} 
      catch (IllegalAccessException e) 
      {} 
     } 
    } 
    catch (PackageManager.NameNotFoundException e) 
    {} 
    catch (ClassNotFoundException e) 
    {} 

    return null; 
} 
+0

你非常.. !!! 你能解释这段代码 – SHA 2014-09-19 09:37:18

+0

和一个更多的查询是如果我想从另一个应用程序(包)得到的细节我需要做什么修改 – SHA 2014-09-19 09:39:23

+1

这个方法遍历字符串' R'类,寻找'静态int's(忽略其他抛出的异常),直到找到一个对应于String资源的值等于's'参数的值,然后返回字段名。 – 2014-09-19 09:52:40

1

从同一applicatoin的活动:

getResources().getString(R.string.alpha) 
+0

其实在我的应用我想,ID通过传递字符串意味着我应该通过传递字符串“ABC” – SHA 2014-09-19 08:42:21

+0

你为什么需要这个获得阿尔法的结果?你的用例是什么? – helleye 2014-09-19 08:48:23

+0

对不起,我不能提供很多应用程序的细节,但我想从字符串 有没有什么办法 – SHA 2014-09-19 08:52:09

0

你可以做一些字符串集(我分享的方法效率很低) 我从来没有尝试过它自己..而且它真的好像没用。资源的名称是特定于你的应用程序和检索这样的用户输入的名字看起来很荒唐..你能指定你的目的吗?

假设你得到了用户的输入,并在“mUserInput”字符串保存它,并定义 α,XYZ,PQR和ABC在strings.xml,并希望通过搜索的价值,知道资源的名称每个字符串。 (在你的问题,如果你知道ABC,那么你想知道的资源,即APLHA的名称)

定义一个int数组[由于资源ID是整数(在R.java文件)

private static final int mStringResourceArray[]{ 
              R.string.alpha, 
              R.string.xyz, 
              R.string.pqr, 
              R.string.abc}; 

定义的方法searchForResourceName(字符串tempUserInput):

private String searchForResourceName(String tempUserInput){ 

    for(int i=;i<=mStringResourceArray.length();i++){ 
      if(tempUserInput == getResources().getString(mStringResourceArray[i]) 
        return mStringResourceArray[i]; 
      else 
      return "No resource with the value given, found" 

    } 

调用方法:

String resourceName = searchForResourceName(mUserInput); 
+0

感谢您的回复,但在这我们需要知道id,所以我们可以使“mStringResourceArray []”,在我的情况下,我不't知道id,所以我想提取它 – SHA 2014-09-19 09:12:15

+0

如果它是一个特定的apk,那么你可以在winZip或7Zip中打开该apk,并转到/res/strings.xml并知道它的价值。 但我上面给出的代码不会使用这个..因为资源是在另一个应用程序中。 注意:如果您未经他们同意编辑/复制他们的应用程序,这可能会侵犯他人的知识产权。 – 2014-09-19 09:19:06

相关问题