在Android中显示基于用户系统语言的字符串

时间:2014-10-27 18:24:17

标签: java android

我有一个枚举类,但我想根据用户系统语言显示字符串。例如,如果系统是英语,则应显示1,2,3 。但如果系统是中文,显示应该完全不同,如"一",“二”,“三”。 (一个是中文1个,二个是中文2个)。

这是我的代码

public enum OrderType {


    ONE("1"), TWO("2"), THREE("3")

    private String name;

    private OrderType(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }

    public static String getEnumByString(String code) {
        for (OrderType e : OrderType.values()) {
            if (code.equals(e.name)) {
                return e.name();
            }
        }
        return null;
    }

}

enum在android中工作正常,我可以在值文件夹中定义String,

喜欢价值观 - 价值观,价值观......我怎样才能使用它?

更新: 我还想使用构造函数来初始化枚举字符串。就像

private OrderType(String name) {
    String temp = getResources().getString(R.string.name);
    this.name = temp ;
}

但我不知道如何传递R.string.parameter的参数.. 第二,如何在枚举类

中使用getResources()函数

5 个答案:

答案 0 :(得分:3)

只需将字符串资源ID作为参数提供给您的枚举:

public enum OrderType {
    ONE(R.string.order_type_one),
    TWO(R.string.order_type_two)

    private final int mTextResourceId;

    OrderType(int resourceId) {
        mTextResourceId = resourceId;
    }

    public int getTextResourceId() {
        return mTextResourceId;
    }
}

在每个所需的资源文件夹中提供这些字符串,例如:

res/values/strings.xml
res/values-es/strings.xml
res/values-fr/string.xml

然后,当你想在TextView的某个地方消费时:

myTextView.setText(myOrderType.getTextResourceId()); 

不需要传递Context,并且在运行时根据当前区域设置确定。

答案 1 :(得分:1)

您应该将字符串保留在字符串xml资源中。这样你就可以从那里进入你的代码。例如:

String one = getResources().getString(R.string.num_one);

然后你只需要在所需的语言文件夹中放入一个带有重载值的strings.xml文件(values-ru,values-sv等)。

答案 2 :(得分:1)

您必须知道enum是静态初始化的。 ONE, TWO, THREE中的每一个都是静态

在android中使用资源,例如字符串,你需要一个context

通常,您无法在静态方法中访问Android上下文或初始化,因此您无法在枚举中使用它们。

即使您可以使用hack使Android上下文静态可用,您仍会遇到问题:

  • 您需要确保在Application#onCreate
  • 之前没有访问过您的OrderType个枚举
  • 您的枚举中的字符串不会反映运行时语言的更改

修改
我希望很明显,您无法使用字符串资源可靠地初始化您的枚举。
但是,您可以将字符串(R.string.string_name)的静态 id与您的枚举关联,然后使用上下文获取所需的资源字符串,如 kcoppock &回答。

答案 3 :(得分:0)

对于此类任务,请使用本地化。

"google on i18n java"

"android app localization"

答案 4 :(得分:-1)

public enum OrderType {

    One(mActivity.getString(R.string.One)), Two(mActivity.getString(R.string.Two));

    private String name;

    private OrderType(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }

    public static String getEnumByString(String code) {
        for (OrderType e : OrderType.values()) {
            if (code.equals(e.name)) {
                return e.name();
            }
        }
        return null;
    }
}

这也是link,我认为这是解决问题的最佳方法。这是目前针对API级别11开发的,但是此代码应该在更高版本上运行。在API 16中进行快速审核之后,我没有看到针对此问题的现有核心Android解决方案,如果您知道其中一个,请在下面发布并分享。