2014-10-27 18 views
1

我有一個枚舉類,但我想顯示基於用戶系統語言的字符串。例如,如果系統是英文的,它應該顯示1,2,3 。但是如果系統是中文的,顯示應該完全不同,如「一」,「二」,「三」。 (一意爲中文,二意爲中文)。基於Android中的用戶系統語言的顯示字符串

這裏是我的代碼

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

} 

枚舉工作在Android精品,我可以定義值文件夾中的字符串,

值一樣-IW,價值觀茹...怎麼能我用那個?

更新: 我也想用構造函數初始化枚舉字符串。就像

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

但我不知道怎麼打發R.string.parameter的參數.. 二,如何我可以使用getResources()函數枚舉類

+0

我認爲您正在尋找['ResourceBundle'](http://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html) – 2014-10-27 18:25:36

+1

那麼問題是什麼?例如,在不同的值文件夾中定義具有相同名稱的字符串並調用'R.string.number_one'。 – 2014-10-27 18:29:38

+0

這是string.xml資源文件的用途之一。 http://developer.android.com/training/basics/supporting-devices/languages.html – zgc7009 2014-10-27 18:29:45

回答

-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解決方案,如果您知道該解決方案,請在下面發帖並分享。

+0

我不認爲這意味着你的想法。 – njzk2 2014-10-27 21:27:14

1

你應該保持在弦你的字符串xml資源。這樣你就可以從那裏獲取它到你的代碼中。例如像這樣:

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

然後你只是把strings.xml檔案在語言文件夾過載值,你要(值-RU,價值觀-SV等)

0

對於那種任務使用本地化。

"google on i18n java" 

"android app localization" 
+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – vusan 2014-10-27 18:51:09

+0

好,但我沒有足夠的聲望評論他的帖子...實際上它是完整的答案,因爲作者問如何修復壞的方法...... 我的回答是:「甚至不嘗試做它通過這種方式」。 – Puh 2014-10-27 19:02:42

+0

請在答案中添加更多的細節或代碼。通知你這是在刪除的方式。 – vusan 2014-10-27 19:15:52

1

你必須知道,enum s的靜態初始化。 ONE, TWO, THREE的每一個是靜態

在android中使用資源,如字符串,你需要一個context

通常,您不能在靜態方法或初始化中訪問Android上下文,因此您不能在枚舉中使用它們。

即使你可以用一個hack實現Android內靜態可你仍然有問題:

  • 你需要確保你沒有枚舉OrderType前在應用#的onCreate
  • 串訪問你的枚舉將不會反映運行系統語言改變

編輯
我希望我很明顯你不能可靠地用字符串資源初始化你的枚舉。
你可以,但是,聯想靜態 ID字符串(R.string.string_name)與你的枚舉,並獲得所需的資源字符串後使用上下文,如kcoppock的回答提出的。

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合格需要,並且在運行時根據當前語言環境確定。

+0

+1。你能解釋一下@StringRes註釋的作用嗎?另外,我想知道枚舉在這種情況下是否具有特別的優勢。 – kiruwka 2014-10-27 22:48:57

+0

哦,是的,'@ StringRes'註釋是Android Support Annotations包('com.android.support:support-annotations:+')的一部分,它基本上暗示編譯器有一個'R.string'引用是期望的。因此,如果您要傳入'R.id'值(這也是一個在技術上有效的int),編譯器會警告它是一個意外的類型。如果您不使用支持註釋依賴項,那麼可以省略這些依賴項。 – kcoppock 2014-10-27 23:02:43

+0

另請參閱:http://tools.android.com/tech-docs/support-annotations – kcoppock 2014-10-27 23:03:21