我想有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。
为什么它对我没用?
如果你在使用Kotlin,你可以这样定义一个扩展函数:
fun Context.getStringResourceByName(stringName: String): String? {
val resId = resources.getIdentifier(stringName, "string", packageName)
return getString(resId)
}
然后简单地使用它。例如,在一个拼图应用程序中,我根据图像文件名设置活动标题:
val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)
在这个例子中,我正在读取基于动态名称的字符串资源。
最好的方法
App.getRes () .getString (R.string.some_id)
将工作在任何地方(Utils,模型也)。
我已经看完了所有的答案,所有的答案都可以让你完成工作。
你可以在Activity或Fragment中使用getString(r.r estring .some_string_id)。
你可以使用Context.getString(r.r string.some_string_id),你不能直接访问getString()方法。像对话框。
问题
当你没有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类。
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标签中添加name字段。
<application
android:name=".App"
...
>
...
</application>
现在可以开始了。在应用程序的任何地方使用app. getappresources (). getstring (r.r string.some_id)。