Android:如何使用其名称从资源中获取字符串?

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是后备的,如果你没有覆盖的区域用户的文件夹,这样一个将用作默认值.

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

  • 如果你在`android.support.v4.app.Fragment`中,你可以直接调用`getString(R.string.mystring)`. (20认同)
  • 我只是在瞎逛.为什么(以谷歌方式)以如此复杂的方式完成?首先获取mystring的数字ID(来自R对象),然后获取该ID的字符串?那个"ID-of-mystring => actualValue"实际上存在于哪里?据我所知mystring => ID-of-mystring在R.java中,但就是这样:) (3认同)
  • 确保“ R”是您项目的R,而不是默认的androidR。 (2认同)
  • 这可能是需要的答案,但它不是被要求的答案!要按名称动态访问字符串资源,请参阅@leonvian的答案...应该是可接受的一个IMO (2认同)

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)

  • 如果有人有充分的理由这样做(例如,数据文件包含一个自定义字符串,决定应该显示哪个资源字符串,或者是否从Internet获取此字符串) - 那么我想指出这个解决方案是正确的.特别是纠正资源类型为`string`而不是`strings`的部分.因为这是合乎逻辑的(就像Android的其他部分一样).所以,谢谢你(以及更多),@ leonvian.:-) (7认同)
  • 尝试过,没有用.'root package'是什么意思? (3认同)
  • @Sameer通过Strings获取数组只需使用:res.getStringArray(R.array.planets_array); 看看这个官方链接:http://developer.android.com/guide/topics/resources/string-resource.html#StringArray (2认同)
  • 凉。为了摆脱单独的方法声明,可以通过以下方式“简化”:`String someStringFromXML = getString(getResources()。getIdentifier(“ some_string_name”,“ string”,getPackageName()));`。 (2认同)

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)

将无处不在(Utils,Models也).

我已经阅读了所有答案,所有答案都可以使您的工作完成.

  • 您可以使用getString(R.string.some_string_id)两种ActivityFragment.
  • 您可以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中的任何地方使用


Haz*_*lo8 7

如果您没有Activity引用,则可以通过以下方式使用上下文:

getContext().getString(R.string.your_string_name);
Run Code Online (Sandbox Code Playgroud)


JCa*_*los 7

如果您使用的是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)

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


roh*_*de7 6

如果您想将其放入 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)


muz*_*diq 6

在 Kotlin 中,利用扩展函数

fun Context.getStringByName(name: String): String {
    return getString(resources.getIdentifier(name, "string", packageName))
}
Run Code Online (Sandbox Code Playgroud)


Har*_*ain 5

getResources()仅在您上课ActivityFragment上课时有效。

  • 随时随地访问字符串资源,

用:

Resources.getSystem().getString(android.R.string.somecommonstuff)
Run Code Online (Sandbox Code Playgroud)