2011-08-10 70 views
2

我想知道如何在Java中使用枚舉。我正在研究Android的配方應用程序。我有一個TabHost中有四個選項卡的屏幕,並希望通過命名常量來引用它們,我相信最好通過枚舉來完成它。Android Java:使用枚舉

private enum mTab { 
    TAB_NAME(0), TAB_INGREDIENT(1), TAB_STEP(2), TAB_MEDIA(3); 

    final int numTab; 

    private mTab(int num){ 
     this.numTab = num; 
    } 

    public int getValue(){ 
     return this.numTab; 
    } 

}; 

現在我想爲每個選項卡創建一個不同的菜單。例如,對於TAB_INGREDIENT,我想要一個名爲「添加成分」的菜單選項,而對於TAB_MEDIA,我想要一個名爲「添加圖像」的菜單選項。

我通過onPrepareOptionsMenu()創建菜單,像這樣

public boolean onPrepareOptionsMenu(Menu menu) { 
    // Clear menu before showing new menu 
    menu.clear(); 

    super.onPrepareOptionsMenu(menu); 

    // Create new menu based on current tab 
    MenuInflater inflater = getMenuInflater(); 
    int tab = getTabHost().getCurrentTab(); 

    switch (tab) { 
     ... 
      } 

    return true; 
} 

的問題是,我不知道要放什麼東西在switch語句。更具體地說,我不知道如何比較「選項卡」,它是一個對應於當前選定選項卡的整數,與枚舉元素進行比較。

+0

這個問題太老了,但我希望我的評論能幫助別人。在Android中不建議使用枚舉,最好使用int常量。特別是對於這個問題int常量比枚舉更好。另外,我們可以使用'IntDef'註釋,如下所述http://blog.shamanland.com/2016/02/int-string-enum.html –

回答

4

您可以在MTAB枚舉下面添加一個方法 -

public static mTab toMTab(int val) { 
    mTab retMTab = null; 
    for (mTab tempTab : mTab.values()) { 
     if(tempTab.getValue() == val) { 
      retMTab = tempTab; 
      break; 
     } 
    } 
    return retMTab; 
} 

,然後在onPrepareOptionsMenu(),你可以這樣做0

switch(mTab.toMTab(intVal)) { 
    case TAB_NAME: 
    ... 
    break; 
    case TAB_INGREDIENT: 
    .. 
    ... 

} 
+0

感謝Gopi,這似乎工作。所以基本上我會通過switch語句將當前選項卡的int值轉換爲mTab。我認爲這也意味着我不需要mTab構造函數,getValue()等等,至少爲了這個目的? –

+0

是的,你可能會取消getValue(),並使用每個枚舉已經可用的ordinal()方法。 – Gopi

1

枚舉變量可以直接放置在Java中的switch語句中。然而,我擔心枚舉可能不是最合適的選擇,因爲你的每個選項卡都在做不同的事情:裝飾或者繼承imho會更好。從我從Josh Bloch那裏學到的東西,如果你必須添加方法到枚舉中,它們應該都是同一個名字,例如:在計算器上操作。

每個字母作爲枚舉的一部分:

Menu v; 
... 
    switch (v) 
    { 
     case A: 
      ... 
     case B: 
     default: 
    }