我想有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。

为什么它对我没用?


当前回答

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

getString(android.R.string.ok)

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

其他回答

为了安全起见,你应该补充: mContext.getResources () .getString (R.string.your_string);

mContext可以是:Fragment的onAttach()中的context或Activity的this。

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

如果你在使用Kotlin,你可以这样定义一个扩展函数:

fun Context.getStringResourceByName(stringName: String): String? {
    val resId = resources.getIdentifier(stringName, "string", packageName)
    return getString(resId)
}

然后简单地使用它。例如,在一个拼图应用程序中,我根据图像文件名设置活动标题:

val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)

在这个例子中,我正在读取基于动态名称的字符串资源。

R.string.<string_name>

在java文件中直接使用这一行。保持简单。

你可以在Activity中尝试:

getResources().getString(R.string.your string name);

在其他情况下,比如片段,……使用

getContext().getResources().getString(R.string.your string name);