是否有可能獲得特定字符串的參考名稱是否有可能獲得Android中的特定字符串的參考名稱
EG。在一個Android應用程序string.xml包含的UI
<resources>
<string name="alpha"> ABC </string>
</resources>
我可以得到的資源引用「阿爾法」的字符串ABC務實地從其他應用或同一應用程序
是否有可能獲得特定字符串的參考名稱是否有可能獲得Android中的特定字符串的參考名稱
EG。在一個Android應用程序string.xml包含的UI
<resources>
<string name="alpha"> ABC </string>
</resources>
我可以得到的資源引用「阿爾法」的字符串ABC務實地從其他應用或同一應用程序
這可以使用反射。但請注意,以下方法不會考慮具有相同值的資源。
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;
}
你可以做一些字符串集(我分享的方法效率很低) 我從來沒有嘗試過它自己..而且它真的好像沒用。資源的名稱是特定於你的應用程序和檢索這樣的用戶輸入的名字看起來很荒唐..你能指定你的目的嗎?
假設你得到了用戶的輸入,並在「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);
感謝您的回覆,但在這我們需要知道id,所以我們可以使「mStringResourceArray []」,在我的情況下,我不't知道id,所以我想提取它 – SHA 2014-09-19 09:12:15
如果它是一個特定的apk,那麼你可以在winZip或7Zip中打開該apk,並轉到/res/strings.xml並知道它的價值。 但我上面給出的代碼不會使用這個..因爲資源是在另一個應用程序中。 注意:如果您未經他們同意編輯/複製他們的應用程序,這可能會侵犯他人的知識產權。 – 2014-09-19 09:19:06
你非常.. !!! 你能解釋這段代碼 – SHA 2014-09-19 09:37:18
和一個更多的查詢是如果我想從另一個應用程序(包)得到的細節我需要做什麼修改 – SHA 2014-09-19 09:39:23
這個方法遍歷字符串' R'類,尋找'靜態int's(忽略其他拋出的異常),直到找到一個對應於String資源的值等於's'參數的值,然後返回字段名。 – 2014-09-19 09:52:40