Android:我如何从资源字符串使用它的名字?

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

为什么它对我没用?

718134 次浏览

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

得到它们
String mystring = getResources().getString(R.string.mystring);

getResources()Context类的一个方法。如果你在ActivityService(扩展上下文)中,你可以像下面这样使用它。

< p > # EYZ0。 只需为每种语言创建不同的文件夹。如果英语是您的默认语言,只需将英文字符串放入res/values/strings.xml。然后创建一个新文件夹values-ru,并将具有相同名称的俄语字符串放入res/values-ru/strings.xml。从这一点上,android选择正确的一个取决于你的设备地区,无论是当你调用getString()或在XML中引用字符串通过@string/mystringres/values/strings.xml中的那些是备用的,如果你没有覆盖用户地区的文件夹,这个将被用作默认值

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

验证您的packageName是否正确。你必须引用你的Android应用程序的根包。

private String getStringResourceByName(String aString) {
String packageName = getPackageName();
int resId = getResources().getIdentifier(aString, "string", packageName);
return getString(resId);
}

我会在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);
}
}
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))

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

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

参考:# EYZ0

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

从字符串中获取资源ID的简单方法。这里resourceName是可绘制文件夹中的ImageView资源的名称,它也包含在XML文件中。

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
ImageView im = (ImageView) findViewById(resID);
Context context = im.getContext();
int id = context.getResources().getIdentifier(resourceName, "drawable",
context.getPackageName());
im.setImageResource(id);

不仅仅来自活动:

public static String getStringByIdName(Context context, String idName) {
Resources res = context.getResources();
return res.getString(res.getIdentifier(idName, "string", context.getPackageName()));
}

如果你没有Activity引用,你可以这样使用你的上下文:

getContext().getString(R.string.your_string_name);

还有一组预定义的Android字符串,如“Ok”,“Cancel”和许多其他-所以你不需要声明所有。可以通过以下方式获取:

getString(android.R.string.ok)

(在本例中为"Ok"字符串)。顺便说一下,还有其他可用的Android资源,例如图标图像等。

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

简单的方法

最好的方法

# EYZ0

将工作在任何地方(Utils,模型也)。

我已经看完了所有的答案,所有的答案都可以让你完成工作。

  • 您可以在ActivityFragment中使用getString(R.string.some_string_id)
  • 你可以在无法直接访问getString()方法的地方使用Context.getString(R.string.some_string_id)。像# EYZ2。

问题

你没有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)

为了安全起见,你应该添加: mContext.getResources () .getString (R.string.your_string); < / p >

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

你可以在Activity中尝试:

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

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

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

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

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

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

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

在java文件中直接使用这一行。保持简单。

如果你使用芬兰湾的科特林,你可以这样定义一个扩展函数:

fun Context.getStringResourceByName(stringName: String): String? {
val resId = resources.getIdentifier(stringName, "string", packageName)
return getString(resId)
}

然后简单地使用它。例如,在一个拼图应用程序中,我根据图像文件名设置活动标题:

val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)

在这个例子中,我正在读取基于动态名称的字符串资源。

getResources()只适用于ActivityFragment类。

  • 为了在任何地方访问字符串资源,

使用:

Resources.getSystem().getString(android.R.string.somecommonstuff)

在Kotlin中,杠杆扩展函数😎

fun Context.getStringByName(name: String): String {
return getString(resources.getIdentifier(name, "string", packageName))
}