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

为什么它对我没用?


当前回答

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

其他回答

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

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

getResources()是Context类的一个方法。如果您在一个活动或服务(扩展上下文)中,您可以像下面这样使用它。

Also note that the whole language dependency can be taken care of by the android framework. Simply create different folders for each language. If english is your default language, just put the english strings into res/values/strings.xml. Then create a new folder values-ru and put the russian strings with identical names into res/values-ru/strings.xml. From this point on android selects the correct one depending on the device locale for you, either when you call getString() or when referencing strings in XML via @string/mystring. The ones from res/values/strings.xml are the fallback ones, if you don't have a folder covering the users locale, this one will be used as default values.

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

如果你想把它放到一个activity或fragmnet中,那么:

getContext().getResources().getString(R.string.string_name);

如果你想从activity或fragment之外的类中获取它,在那里你没有activity context,那么使用application context:

getApplicationContext().getResources().getString(R.string.string_name);

你可以在Activity中尝试:

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

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

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

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

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

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

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

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

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