我想有2种语言的UI和单独的字符串值为他们在我的资源文件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。

为什么它对我没用?


当前回答

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

其他回答

更简单的方法是在活动中使用getString()函数。

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

参考:http://developer.android.com/guide/topics/resources/string-resource.html

我认为这个功能是在最近的Android版本中添加的,任何了解历史的人都可以对此发表评论。

我会在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);
    }
}

验证您的packageName是否正确。你必须引用你的Android应用程序的根包。

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

getResources()只在Activity或Fragment类中工作。

为了在任何地方访问字符串资源,

use:

Resources.getSystem().getString(android.R.string.somecommonstuff)

还有一组预定义的Android字符串,如“Ok”,“Cancel”和许多其他-所以你不需要声明所有。可以通过以下方式获取:

getString(android.R.string.ok)

(在本例中为"Ok"字符串)。顺便说一下,还有其他可用的Android资源,例如图标图像等。