Android:如何从资源中获取字符串?


我想有两种语言的用户界面和单独的字符串值为他们在我的资源文件res\values\strings.xml

<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>

<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>

现在我需要在我的应用程序中动态地检索这些值:

spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);

我的问题是, i = 0 。 这个代码是从这个链接

为什么它不起作用?


Answers



您引用的链接似乎与在运行时生成的字符串一起工作。 strings.xml中的字符串不会在运行时创建。 你可以通过

String mystring = getResources().getString(R.string.mystring);

getResources()Context类的一个方法。 如果你在一个ActivityService (扩展上下文)内,你可以像这个片段一样使用它。

还要注意整个语言的依赖关系可以由android框架来处理 。 只需为每种语言创建不同的文件夹。 如果英语是您的默认语言,只需将英文字符串放入res/values/strings.xml 。 然后创建一个新的文件夹values-ru ,并将具有相同名称的俄语字符串放到res/values-ru/strings.xml 。 从这一点上,android选择正确的一个取决于你的设备语言环境,无论是当你调用getString()或通过@string/mystring引用XML中的@string/mystring 。 来自res/values/strings.xml是后备文件,如果你没有覆盖用户区域的文件夹,这个文件夹将被用作默认值。

请参阅本地化提供资源以获取更多信息。




我也有同样的问题。 但是下面的代码适用于我:验证你的packageName是否正确。 你必须参考你的Android应用程序的根包。

private String getStringResourceByName(String aString) {
      String packageName = getPackageName();
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }



不仅来自活动:

    public static String byIdName(Context context, String name) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
    }



getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))



我会添加一些东西给leonvian的解决方案,所以如果有任何机会在资源中找不到字符串(返回值0,这不是一个有效的资源代码),该函数可能会返回一些东西:

private String getStringResourceByName(String aString) {
    String packageName = getPackageName();
    int resId = getResources()
            .getIdentifier(aString, "string", packageName);
    if (resId == 0) {
        return aString;
    } else {
        return getString(resId);
    }
}






如果您没有“活动”引用,则可以通过以下方式使用您的上下文:

getContext().getString(R.string.your_string_name);



还有一组预定义的Android字符串,比如“Ok”,“Cancel”等等 - 所以你不必声明全部。 他们可以简单地通过:

getString(android.R.string.ok)

(在这种情况下,“确定”字符串)。 顺便说一句,还有其他的Android资源,例如图标图像等




Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);



从字符串获取资源ID的简单方法。 在这里,resourceName是在XML文件中包含的可绘制文件夹中的资源ImageView的名称。

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
    ImageView im = (ImageView) findViewById(resID);
    Context context = im.getContext();
    int id = context.getResources().getIdentifier(resourceName, "drawable",
    context.getPackageName());
    im.setImageResource(id);