2013-06-26 7 views
11

Hallo Freunde erstellen ich eine Anwendung, die eine Registerkarte Anwendung ist.Wie können wir Menüelement dynamisch hinzufügen

in meiner Heimat, die sherlockFragmentActivity erweitert, ich aufpumpen menu.xml und enthält Code für ein optionMenuitem Klick Listener. Die Fragmentactivity enthält Tabhost und lädt auf jeder Registerkarte Fragmente. das ist mein 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> 

und das ist mein onCreateOptionMenu und onOptionItemSelected Methoden in der Klasse Startseite

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

und das ist mein onOptionItemSelected Methode

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

ich brauche einige hinzufügen Menüs abhängig von Tab-Wechsel. das ist auf der Registerkarte ändern ich lade verschiedene Fragmente und wenn Fragment ändert ich muss neue Elemente zum Menü hinzufügen. meine ListFrag, die SherlockFragment erweitert und es wird geladen, wenn ich auf die 3. Registerkarte klicke. wenn dieses Fragment Last i 1 Menüpunkt in das Menü

Antwort

2

hier ist ein Beispiel hinzufügen müssen ... es könnte Ihnen helfen ...

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

mein Problem ist, wie für verschiedene Fragmente verschiedenen Menüpunkt hinzufügen – Vikky

21

die folgende Art und Weise versuchen.

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

Dies kann Ihnen helfen.

+1

ich brauche dynamicaly einen neuen Menüpunkt hinzuzufügen, wenn ein bestimmtes Fragment – Vikky

+1

geladen Sie [dies überprüfen hat ] (http://stackoverflow.com/questions/13596113/adding-menu-item-dynamic-from-herlockactionbar-fragment-tabs) Frage? – Gunaseelan

+0

ya .... jetzt habe ich die Antwort bekommen. – Vikky

1

Verwendung onPrepareOptionsMenu Methode und klar alle Menü zuerst

menu.clear(); 

fügen Sie dann Menü.

Auch refer here .. überprüfen seine onPrepareOptionsMenu Methode

4

In den menu.xml sollten Sie alle Menüpunkte hinzufügen. Dann können Sie Elemente ausblenden, die beim ersten Laden nicht angezeigt werden sollen.

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

setHasOptionsMenu(true) im onCreate() -Methode Fügen Sie die Menüpunkte in Ihrem Fragment Klasse aufzurufen.

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

Sie brauchen nicht onCreateOptionsMenu in Ihrer Fragment Klasse außer Kraft setzen wieder. Menüpunkte können geändert werden (Hinzufügen/remoev) durch Überschreiben onPrepareOptionsMenu Methode verfügbar in Fragment.

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

} 
0

basierend auf Gunaseelan antworten

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