Iva*_*van 527 string resources android
我想在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>
Run Code Online (Sandbox Code Playgroud)
现在我需要在我的应用中动态检索这些值:
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);
Run Code Online (Sandbox Code Playgroud)
我的问题是i = 0
.
为什么它在我的情况下不起作用?
小智 1024
您所指的链接似乎适用于在运行时生成的字符串.strings.xml中的字符串不是在运行时创建的.你可以通过他们
String mystring = getResources().getString(R.string.mystring);
Run Code Online (Sandbox Code Playgroud)
getResources()
是一种Context
类的方法.如果你在a Activity
或a Service
(扩展Context)中,你可以像在这个片段中一样使用它.
另请注意,整个语言依赖关系可以由android框架来处理.只需为每种语言创建不同的文件夹.如果英语是你的默认语言,只需将英文字符串放入res/values/strings.xml
.然后创建一个新文件夹values-ru
,并将具有相同名称的俄语字符串放入res/values-ru/strings.xml
.从这一点开始,android会根据您的设备区域设置选择正确的一个,无论是在调用时getString()
还是在XML中引用字符串时@string/mystring
.从那些res/values/strings.xml
是后备的,如果你没有覆盖的区域用户的文件夹,这样一个将用作默认值.
leo*_*ian 306
我也有同样的问题.但是下面的代码对我有用:验证你的packageName是否正确.您必须参考Android应用程序的根软件包.
private String getStringResourceByName(String aString) {
String packageName = getPackageName();
int resId = getResources().getIdentifier(aString, "string", packageName);
return getString(resId);
}
Run Code Online (Sandbox Code Playgroud)
kon*_*mik 67
不仅仅来自活动:
public static String byIdName(Context context, String name) {
Resources res = context.getResources();
return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
}
Run Code Online (Sandbox Code Playgroud)
TOU*_*del 38
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))
Run Code Online (Sandbox Code Playgroud)
Mig*_*ero 25
我会在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);
}
}
Run Code Online (Sandbox Code Playgroud)
Ere*_*maz 14
更简单的方法是使用getString()
活动中的功能.
String myString = getString(R.string.mystring);
Run Code Online (Sandbox Code Playgroud)
参考:http://developer.android.com/guide/topics/resources/string-resource.html
我认为这个功能是在最近的Android版本中添加的,任何知道历史的人都可以对此发表评论.
小智 13
从字符串获取资源字符串到TextView的简单方法.这里resourceName是资源的名称
int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
Run Code Online (Sandbox Code Playgroud)
Khe*_*raj 10
App.getRes().getString(R.string.some_id)
我已经阅读了所有答案,所有答案都可以使您的工作完成.
getString(R.string.some_string_id)
两种Activity
或Fragment
.Context.getString(R.string.some_string_id)
在没有直接访问getString()
方法的地方使用.喜欢Dialog
.当您没有Context
访问权限时,就像您Util
班级中的方法一样.
假设没有上下文的方法如下.
public void someMethod(){
...
// can't use getResource() or getString() without Context.
}
Run Code Online (Sandbox Code Playgroud)
现在,您将Context
在此方法中作为参数传递并使用getString().
public void someMethod(Context context){
...
context.getString(R.string.some_id);
}
Run Code Online (Sandbox Code Playgroud)
我做的是
public void someMethod(){
...
App.getAppResources().getString(R.string.some_id)
}
Run Code Online (Sandbox Code Playgroud)
什么?在您的应用中的任何地方使用都非常简单!
所以这是一个解决方案,您可以通过它从任何地方访问资源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;
}
}
Run Code Online (Sandbox Code Playgroud)
在manifest.xml
<application
标记中添加名称字段.
<application
android:name=".App"
...
>
...
</application>
Run Code Online (Sandbox Code Playgroud)
现在你很高兴.App.getAppResources().getString(R.string.some_id)
在app中的任何地方使用
如果您没有Activity引用,则可以通过以下方式使用上下文:
getContext().getString(R.string.your_string_name);
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Kotlin,您可以按如下方式定义扩展函数:
fun Context.getStringResourceByName(stringName: String): String? {
val resId = resources.getIdentifier(stringName, "string", packageName)
return getString(resId)
}
Run Code Online (Sandbox Code Playgroud)
然后简单地使用它。例如,在拼图应用中,我根据图像文件名设置活动标题:
val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我正在读取基于动态名称的字符串资源。
如果您想将其放入 Activity 或 Fragmnet 中,则:
getContext().getResources().getString(R.string.string_name);
Run Code Online (Sandbox Code Playgroud)
如果您想从活动或片段之外的类获取它,而您没有活动上下文,则使用应用程序上下文:
getApplicationContext().getResources().getString(R.string.string_name);
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中,利用扩展函数
fun Context.getStringByName(name: String): String {
return getString(resources.getIdentifier(name, "string", packageName))
}
Run Code Online (Sandbox Code Playgroud)
getResources()
仅在您上课Activity
或Fragment
上课时有效。
用:
Resources.getSystem().getString(android.R.string.somecommonstuff)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
549208 次 |
最近记录: |