我想在我的资源文件 res\values\strings.xml
中有两种语言的 UI 和单独的字符串值:
<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
。
为什么它在我的情况下不起作用?
en
还是 ru
?
您所指的链接似乎适用于运行时生成的字符串。 strings.xml 中的字符串不是在运行时创建的。你可以通过
String mystring = getResources().getString(R.string.mystring);
getResources()
是 Context
类的方法。如果您在 Activity
或 Service
(扩展 Context)内,则可以像在此代码段中一样使用它。
另外请注意,整个语言依赖项都可以由 android 框架处理。只需为每种语言创建不同的文件夹。如果英语是您的默认语言,只需将英语字符串放入 res/values/strings.xml
。然后创建一个新文件夹 values-ru
并将具有相同名称的俄语字符串放入 res/values-ru/strings.xml
。从这一点开始,当您调用 getString()
或通过 @string/mystring
引用 XML 中的字符串时,android 会根据您的设备区域设置为您选择正确的区域。 res/values/strings.xml
中的那些是备用的,如果您没有覆盖用户区域设置的文件夹,则该文件夹将用作默认值。
有关详细信息,请参阅 Localization 和 Providing Resources。
验证您的 packageName 是否正确。您必须参考您的 Android 应用程序的根包。
private String getStringResourceByName(String aString) {
String packageName = getPackageName();
int resId = getResources().getIdentifier(aString, "string", packageName);
return getString(resId);
}
string
而不是 strings
的部分。因为这是合乎逻辑的(就像 Android 的其他部分一样)。所以,谢谢你(以及更多),@leonvian。 :-)
String someStringFromXML = getString(getResources().getIdentifier("some_string_name", "string", getPackageName()));
。
不仅来自活动:
public static String getStringByIdName(Context context, String idName) {
Resources res = context.getResources();
return res.getString(res.getIdentifier(idName, "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);
}
}
最佳方法
App.getRes().getString(R.string.some_id)
将在任何地方工作(实用程序,模型也)。
我已阅读所有答案,所有答案都可以使您的工作完成。
您可以在 Activity 或 Fragment 中使用 getString(R.string.some_string_id)。
您可以在无法直接访问 getString() 方法的情况下使用 Context.getString(R.string.some_string_id) 。喜欢对话框。
问题
当您没有 Context
访问权限时,例如您的 Util
类中的方法。
假设下面的方法没有上下文。
public void someMethod(){
...
// can't use getResource() or getString() without Context.
}
现在您将在此方法中将 Context
作为参数传递并使用 getString().
public void someMethod(Context context){
...
context.getString(R.string.some_id);
}
我所做的是
public void someMethod(){
...
App.getAppResources().getString(R.string.some_id)
}
什么?在您的应用程序中的任何地方使用都非常简单!
因此,这里有一个解决方案,您可以通过它从 Util class
等任何地方访问资源。
import android.app.Application;
import android.content.res.Resources;
public class App extends Application {
private static Resources resources;
@Override
public void onCreate() {
super.onCreate();
resources = getResources();
}
public static Resources getAppResources() {
return resources;
}
}
将名称字段添加到您的 manifest.xml
<application
标记。
<application
android:name=".App"
...
>
...
</application>
现在你可以走了。在应用程序的任何位置使用 App.getAppResources().getString(R.string.some_id)
。
getResourses
,getResources
会导致覆盖。此外,单例模式似乎没有必要,可能可以跳过。此解决方案是否存在内存泄漏问题?
更简单的方法是在 Activity 中使用 getString()
函数。
String myString = getString(R.string.mystring);
参考:http://developer.android.com/guide/topics/resources/string-resource.html
我认为这个功能是在最近的 Android 版本中添加的,任何知道历史的人都可以对此发表评论。
一种将资源字符串从字符串获取到 TextView 的简单方法。这里resourceName是资源的名称
int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
getResources()
仅在您在 Activity
或 Fragment
班级时有效。
随时随地访问字符串资源,
利用:
Resources.getSystem().getString(android.R.string.somecommonstuff)
如果您没有 Activity 引用,则可以通过以下方式使用您的上下文:
getContext().getString(R.string.your_string_name);
如果您使用的是 Kotlin,您可以定义一个扩展函数,如下所示:
fun Context.getStringResourceByName(stringName: String): String? {
val resId = resources.getIdentifier(stringName, "string", packageName)
return getString(resId)
}
然后简单地使用它。例如,在一个 Puzzles 应用程序中,我根据图像文件名设置 Activity 标题:
val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)
在此示例中,我正在读取基于动态名称的字符串资源。
在 Kotlin 中,利用扩展函数 😎
fun Context.getStringByName(name: String): String {
return getString(resources.getIdentifier(name, "string", packageName))
}
还有一组预定义的 Android 字符串,例如“Ok”、“Cancel”和许多其他字符串——因此您不必全部声明。它们可以通过以下方式获得:
getString(android.R.string.ok)
(在这种情况下,“Ok”字符串)。顺便说一句,还有其他可用的 Android 资源,例如图标图像等。
字符串 myString = getString(R.string.mystring);
简单的方法
如果您想在活动或片段网络中获取它,那么:
getContext().getResources().getString(R.string.string_name);
如果您想从没有活动上下文的活动或片段之外的类中获取它,请使用应用程序上下文:
getApplicationContext().getResources().getString(R.string.string_name);
您可以在 Activity 中尝试此操作:
getResources().getString(R.string.your string name);
在片段等其他情况下,......使用
getContext().getResources().getString(R.string.your string name);
为了安全起见,您应该添加: mContext.getResources().getString(R.string.your_string);
mContext 可以是:Fragment 的 onAttach() 或 Activity 的 this 中的上下文。
R.string.<string_name>
直接在您的 java 文件中使用该行。把事情简单化。
android.support.v4.app.Fragment
中,您可以直接调用getString(R.string.mystring)
。