我想为UI提供2种语言,并在我的资源文件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
。
为什么在我的情况下不起作用?
#1楼
我也有同样的问题。 但是下面的代码对我有用:验证您的packageName是否正确。 您必须参考Android应用程序的根软件包。
private String getStringResourceByName(String aString) {
String packageName = getPackageName();
int resId = getResources().getIdentifier(aString, "string", packageName);
return getString(resId);
}
#2楼
我会在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);
}
}
#3楼
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))
#4楼
更简单的方法是在活动中使用getString()
函数。
String myString = getString(R.string.mystring);
参考: http : //developer.android.com/guide/topics/resources/string-resource.html
我认为此功能是在最新的Android版本中添加的,任何知道历史的人都可以对此发表评论。
#5楼
一种将资源字符串从字符串转换为TextView的简单方法。 这里resourceName是资源的名称
int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
#6楼
不仅来自活动:
public static String byIdName(Context context, String name) {
Resources res = context.getResources();
return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
}
#7楼
如果没有活动参考,则可以通过以下方式使用上下文:
getContext().getString(R.string.your_string_name);
#8楼
还有一组预定义的Android字符串,例如“ Ok”,“ Cancel”以及许多其他字符串 -因此您不必全部声明。 可以通过以下方式简单地获得它们:
getString(android.R.string.ok)
(在这种情况下,为“ Ok”字符串)。 顺便说一句,还有其他可用的Android资源,例如图标图像等。
#9楼
字符串myString = getString(R.string.mystring);
简单的方法
#10楼
最佳方法
App.getRes().getString(R.string.some_id)
可以在所有地方使用(实用程序,模型也可以)。
我已经阅读了所有答案,所有答案都可以帮助您完成工作。
- 您可以在
Activity
或Fragment
使用getString(R.string.some_string_id)
。 - 您可以在没有直接访问
getString()
方法的地方使用Context.getString(R.string.some_string_id)
。 像Dialog
一样。
问题
当您没有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)
。
#11楼
为了安全起见,您应该添加:mContext.getResources()。getString(R.string.your_string);
mContext可以是:Fragment的onAttach()或Activity的上下文。
#12楼
您可以在活动中尝试:
getResources().getString(R.string.your string name);
在其他情况下,例如碎片,...使用
getContext().getResources().getString(R.string.your string name);
#13楼
如果您希望将其放入活动或fragmnet中,则:
getContext().getResources().getString(R.string.string_name);
如果要从没有活动上下文的活动或片段之外的类中获取它,请使用应用程序上下文:
getApplicationContext().getResources().getString(R.string.string_name);
#14楼
您引用的链接似乎可以在运行时生成的字符串中使用。 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会根据设备的语言环境为您选择正确的@string/mystring
。 res/values/strings.xml
中的那些是备用的,如果您没有覆盖用户区域设置的文件夹,则该文件夹将用作默认值。