Android:如何使用名称从资源中获取字符串?

新手上路,请多包涵

我想在我的资源文件 res\values\strings.xml 中为 UI 提供 2 种语言和单独的字符串值:

 <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

为什么它在我的情况下不起作用?

原文由 Ivan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
2 个回答

您所指的链接似乎适用于运行时生成的字符串。 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 中的字符串时。来自 res/values/strings.xml 的那些是后备的,如果您没有覆盖用户区域设置的文件夹,则该文件夹将用作默认值。

有关更多信息,请参阅 本地化提供资源

原文由 user658042 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 Kotlin 中,利用扩展函数 😎

 fun Context.getStringByName(name: String): String {
    return getString(resources.getIdentifier(name, "string", packageName))
}

原文由 M.Muzammil 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题