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

时间:2011-09-21 00:19:24

标签: android string resources

我希望在我的资源文件res\values\strings.xml中为UI提供2种语言并为它们分别设置字符串值:

<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

为什么它在我的情况下不起作用?

18 个答案:

答案 0 :(得分:964)

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

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

getResources()Context类的一种方法。如果您位于ActivityService(扩展上下文)中,则可以像使用此代码段一样使用它。

同样请注意,整个语言依赖关系可以由android框架来处理。 只需为每种语言创建不同的文件夹。如果英语是您的默认语言,只需将英文字符串放入res/values/strings.xml。然后创建一个新文件夹values-ru并将具有相同名称的俄语字符串放入res/values-ru/strings.xml。从这一点开始,android会根据您的设备区域设置选择正确的一个,无论是当您调用getString()还是通过@string/mystring引用XML中的字符串时。 res/values/strings.xml中的那些是后备的,如果您没有覆盖用户区域设置的文件夹,则此文件将用作默认值。

有关详细信息,请参阅LocalizationProviding Resources

答案 1 :(得分:288)

我有同样的问题。但是下面的代码对我有用: 验证您的packageName是否正确。您必须参考Android应用程序的根软件包。

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

答案 2 :(得分:64)

不仅仅来自活动:

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

答案 3 :(得分:37)

getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))

答案 4 :(得分: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);
    }
}

答案 5 :(得分:13)

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

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

参考:http://developer.android.com/guide/topics/resources/string-resource.html

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

答案 6 :(得分:9)

将字符串中的资源字符串转换为TextView的简单方法。这里resourceName是资源的名称

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);

答案 7 :(得分:7)

如果您没有活动参考,则可以这种方式使用您的上下文:

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

答案 8 :(得分:6)

最佳方法

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.
}

现在,您将在此方法中传递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)

答案 9 :(得分:4)

还有一组预定义的Android字符串,例如&#34; Ok&#34;,&#34;取消&#34;和许多其他人 - 所以你不必宣布所有。他们只需通过以下方式获取:

getString(android.R.string.ok)

(在这种情况下,&#34; Ok&#34;字符串)。 BTW还有其他可用的Android资源,例如图标图像等。

答案 10 :(得分:3)

如果您使用的是 Kotlin ,则可以如下定义扩展功能:

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

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

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

在此示例中,我正在基于动态名称读取字符串资源。

答案 11 :(得分:1)

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

简单方法

答案 12 :(得分:1)

getResources()仅在您处于ActivityFragment类中时有效。

  • 在任何地方都可以访问字符串资源,

使用:

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

答案 13 :(得分:1)

您可以在“活动”中尝试以下操作:

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

在其他情况下,例如碎片,...使用

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

答案 14 :(得分:0)

如果您希望将其放入活动或fragmnet中,则:

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

如果您想从没有活动上下文的活动或片段之外的类中获取它,请使用应用程序上下文:

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

答案 15 :(得分:0)

为了安全起见,您应该添加: mContext.getResources()。getString(R.string.your_string);

mContext可以是:Fragment的onAttach()或Activity的上下文。

答案 16 :(得分:0)

在 Kotlin 中,利用扩展函数?

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

答案 17 :(得分:-1)

R.string.<string_name>

直接在您的Java文件中使用该行。保持简单。