2013-06-26 24 views
11

hi frnds sto creando un'applicazione che è un'applicazione di tabulazione.come possiamo aggiungere dinamicamente la voce di menu

nella mia casa che estende sherlockFragmentActivity, sto gonfiando menu.xml e include il codice per l'opzione listener di clicMenuitem. Fragmentactivity contiene tabhost e su ogni scheda carica frammenti. questo è il mio 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> 

e questo è il mio onCreateOptionMenu e metodi onOptionItemSelected in classe casa

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

e questo è il mio metodo 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; 
    } 

ho bisogno di aggiungere un po ' menu a seconda del cambio di tabulazione. che è in modifica scheda caricamento diversi frammenti e quando modifiche ai frammenti ho bisogno di aggiungere nuovi elementi al menu. il mio ListFrag che estende SherlockFragment e verrà caricato quando clicco sulla terza scheda. quando questo carico frammento ho bisogno di aggiungere l'elemento 1 di menu al menu

risposta

2

ecco un esempio ... potrebbe aiutarti ...

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

il mio problema è come aggiungere la voce di menu diverso per i diversi frammenti – Vikky

21

provare il seguente modo.

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

Questo può aiutare.

+1

ho bisogno di aggiungere una nuova voce di menu dynamicaly quando un particolare frammento viene caricato – Vikky

+1

avete controllato [questo ] (http://stackoverflow.com/questions/13596113/adding-menu-item-dynamically-from-sherlockactionbar-fragment-tabs) domanda? – Gunaseelan

+0

ya .... ora ho la risposta. – Vikky

1

utilizzare il metodo onPrepareOptionsMenu e chiaro tutti i menu di primo utilizzo

menu.clear(); 

quindi aggiungere menu.

anche refer here .. Verificare la sua onPrepareOptionsMenu metodo

4

Negli si dovrebbe aggiungere tutte le voci di menu menu.xml. Quindi puoi nascondere gli elementi che non vuoi vedere nel caricamento iniziale.

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

Aggiungere setHasOptionsMenu(true) nel metodo onCreate() per richiamare le voci di menu nella tua classe Fragment.

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

Non è necessario eseguire l'override onCreateOptionsMenu nella classe Frammento di nuovo. Le voci del menu possono essere modificate (Aggiungi/Elimina) ignorando il metodo onPrepareOptionsMenu disponibile in Fragment.

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

} 
0

sulla base di Gunaseelan rispondere

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