是否可以获取特定字符串的引用名称
EG。在一个Android应用程序中,string.xml包含UI
<resources>
<string name="alpha"> ABC </string>
</resources>
我可以获得资源参考&#34; alpha&#34; for String ABC来自另一个应用程序或同一个应用程序
答案 0 :(得分:1)
来自相同申请的活动:
getResources().getString(R.string.alpha)
答案 1 :(得分: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;
}
我想出了一种从外部包中获取String值的资源名称的方法。在以下方法中,第一个参数是包名称 - 例如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;
}
答案 2 :(得分:0)
你可以为一些字符串设置(我共享的方法非常低效。) 我自己从来没有尝试过..而且它似乎毫无用处..资源的名称是特定于你的应用程序,从用户输入中检索这些名称似乎很荒谬..你能说明你的目的吗?
假设您收到了来自用户的输入并将其保存在&#34; mUserInput&#34;字符串并已定义 你的strings.xml中有alpha,xyz,pqr和abc,你想通过搜索每个字符串的值来知道资源的名称。 (在你的问题中,如果你知道ABC那么你想知道资源的名称,即aplha)
定义一个int数组[因为资源ID是整数(在R.java文件中)]
private static final int mStringResourceArray[]{
R.string.alpha,
R.string.xyz,
R.string.pqr,
R.string.abc};
定义方法searchForResourceName(String 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);