2013-06-26 36 views
11

嗨frnds正在創建一個應用程序是一個選項卡應用程序。我們如何動態添加菜單項

在我的家中它擴展了sherlockFragmentActivity,我正在充氣menu.xml,並在optionMenuitem click click listener中包含代碼。 Fragmentactivity包含tabhost,並在每個選項卡上加載碎片。 這是我menu.xml文件

<item 
     android:id="@+id/action_settings" 
     android:orderInCategory="100" 
     android:showAsAction="always" 
     android:icon="@drawable/setting_selector" 
     android:title="" 
     > 
     <menu > 
      <item 
       android:id="@+id/Profile" 
       android:showAsAction="ifRoom" 
       android:title="Profile"/> 
      <item 
       android:id="@+id/chngDoctor" 
       android:showAsAction="ifRoom" 
       android:title="Change doctor" 
       android:visible="false"/> 
      <item 
       android:id="@+id/changePword" 
       android:showAsAction="ifRoom" 
       android:title="Change password"/> 
      <item 
       android:id="@+id/logout" 
       android:showAsAction="ifRoom" 
       android:title="Logout"/> 
     </menu> 
    </item> 

,這是我onCreateOptionMenu,並在類家庭onOptionItemSelected方法

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    getSupportMenuInflater().inflate(R.menu.main, menu); 
    SubMenu subMenu = (SubMenu) menu.getItem(0).getSubMenu(); 
    if(userType.equals("admin")) 
     subMenu.getItem(1).setVisible(true); 
    else 
     subMenu.getItem(1).setVisible(false); 
    return true; 
} 

,這是我onOptionItemSelected方法

@Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) { 
     case R.id.Profile: 
       break; 
     case R.id.changePword : 
      break; 
     case R.id.chngDoctor : 
       break; 
     case R.id.logout: 
      Home.this.finish(); 
      break; 
     } 
     return true; 
    } 

我需要添加一些菜單取決於選項卡更改。這是在選項卡更改我加載不同的片段和片段更改時,我需要添加新的項目菜單。我的ListFrag擴展了SherlockFragment,當我點擊第3個選項卡時它會加載。當此片段負載,我需要1個菜單項添加到菜單

回答

2

這裏有一個例子...它可以幫助你......

private static final int MENU_ADD = Menu.FIRST; 
    private static final int MENU_LIST = MENU.FIRST + 1; 
    private static final int MENU_REFRESH = MENU.FIRST + 2; 
    private static final int MENU_LOGIN = MENU.FIRST + 3; 


    @Override 
     public boolean onPrepareOptionsMenu(Menu menu) { 
      menu.clear(); 
      if(enableAdd) 
       menu.add(0, MENU_ADD, Menu.NONE, R.string.your-add-text).setIcon(R.drawable.your-add-icon); 
      if(enableList) 
       menu.add(0, MENU_LIST, Menu.NONE, R.string.your-list-text).setIcon(R.drawable.your-list-icon); 
      if(enableRefresh) 
       menu.add(0, MENU_REFRESH, Menu.NONE, R.string.your-refresh-text).setIcon(R.drawable.your-refresh-icon); 
      if(enableLogin) 
       menu.add(0, MENU_LOGIN, Menu.NONE, R.string.your-login-text).setIcon(R.drawable.your-login-icon); 
      return super.onPrepareOptionsMenu(menu); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      super.onOptionsItemSelected(item); 

      switch (item.getItemId()) { 
      case MENU_ADD: doAddStuff(); break; 
      case MENU_LIST: doListStuff(); break; 
      case MENU_REFRESH: doRefreshStuff(); break; 
      case MENU_LOGIN: doLoginStuff(); break; 
      } 
      return false; 
+0

我的問題是,如何針對不同的片段 – Vikky

21

請嘗試以下方法。

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 

     menu.add(0, 0, 0, "Option1").setShortcut('3', 'c'); 
     menu.add(0, 1, 0, "Option2").setShortcut('3', 'c'); 
     menu.add(0, 2, 0, "Option3").setShortcut('4', 's'); 

     SubMenu sMenu = menu.addSubMenu(0, 3, 0, "SubMenu"); //If you want to add submenu    
     sMenu.add(0, 4, 0, "SubOption1").setShortcut('5', 'z'); 
     sMenu.add(0, 5, 0, "SubOption2").setShortcut('5', 'z');    

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) {   

     switch (item.getItemId()) { 
     case 0: 
      // code for option1 
      return true; 
     case 1: 
      // code for option2 
      return true; 
     case 2: 
      // code for option3 
      return true;    
     case 4: 
      // code for subOption1 
      return true; 
     case 5: 
      // code for subOption2 
      return true;    
     } 
     return super.onOptionsItemSelected(item); 
    } 

這可能對你有幫助。

+1

添加不同的菜單項,我需要dynamicaly添加新的菜單項時特定片段被加載 – Vikky

+1

你檢查[此](http://stackoverflow.com/questions/13596113/adding-menu-item-dynamically-from-sherlockactionbar-fragment-tabs)問題? – Gunaseelan

+0

你....現在我得到了答案。 – Vikky

1

使用onPrepareOptionsMenu方法和清除所有菜單首先使用

menu.clear(); 

再添加菜單。

而且refer here ..檢查其onPrepareOptionsMenu方法

4

menu.xml你應該添加所有的菜單項。然後,您可以隱藏您在初始加載時不想看到的項目。

<item 
    android:id="@+id/action_newItem" 
    android:icon="@drawable/action_newItem" 
    android:showAsAction="never" 
    android:visible="false" 
    android:title="@string/action_newItem"/> 

添加setHasOptionsMenu(true)在onCreate()方法來調用您的片段類的菜單項。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

你不需要在你的Fragment類中再次覆蓋onCreateOptionsMenu。通過覆蓋片段中可用的方法onPrepareOptionsMenu可以更改菜單項目(Add/remoev)。

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    menu.findItem(R.id.action_newItem).setVisible(true); 
    super.onPrepareOptionsMenu(menu); 

} 
0

基於Gunaseelan回答

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    menu.removeGroup(1); 
    if (iotsnames.isEmpty()) return true; 
    for (int i=0; i<iotsnames.size(); i++){ 
     menu.add(1, i, 0, iotsnames.get(i)); 
    } 
    return true; 
} 
相關問題