2014-09-19 67 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

相關問題