it-swarm.cn

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

我希望在我的资源文件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

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

478
Ivan

您所指的链接似乎适用于在运行时生成的字符串。 strings.xml中的字符串不是在运行时创建的。你可以通过他们

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

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

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

请参阅 本地化提供资源 了解更多信息。

956
user658042

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

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

不仅仅来自活动:

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

我会在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);
    }
}
25
Miguel Rivero

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

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

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

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

13
Eren Yilmaz

从字符串获取资源字符串到TextView的简单方法。这里resourceName是资源的名称

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

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

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

最佳方法

App.getRes().getString(R.string.some_id)

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

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

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

5
Khemraj

还有一组 预定义的Android字符串 例如“Ok”,“Cancel”等等 - 因此您不必声明全部。它们仅通过以下方式提供:

getString(Android.R.string.ok)

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

4
forsberg

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

简单的方法

1
Avinash

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

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

0
O Thạnh Ldt