是否可以获取Android中特定String的引用名称

时间:2014-09-19 08:28:52

标签: android

是否可以获取特定字符串的引用名称

EG。在一个Android应用程序中,string.xml包含UI

<resources>
    <string name="alpha"> ABC </string>
</resources>

我可以获得资源参考&#34; alpha&#34; for String ABC来自另一个应用程序或同一个应用程序

3 个答案:

答案 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);