2013-06-26 43 views
11

Cześć! Tworzę aplikację, która jest aplikacją kart.w jaki sposób możemy dynamicznie dodawać pozycje menu?

w moim domu, który rozszerza sherlockFragmentActivity, nadpisuję menu.xml i zawiera kod dla opcji odbiornika clickMenuitem. Fragmentactivity zawiera tabhost i na każdej karcie ładuje fragmenty. to moja 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> 

a to mój onCreateOptionMenu i onOptionItemSelected metody w klasie Home

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

a to mój onOptionItemSelected metoda

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

muszę dodać kilka menu w zależności od zmiany karty. czyli na zmianę tabulacji ładuję różne fragmenty, a po zmianie fragmentów muszę dodać nowe pozycje do menu. mój ListFrag, który rozszerza SherlockFragment i zostanie załadowany po kliknięciu na trzeciej zakładce. gdy obciążenie fragment muszę dodać pozycję 1 menu do menu

Odpowiedz

2

tutaj jest przykład ... to może ci pomóc ...

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

moim problemem jest to, jak dodać inną pozycję menu dla różnych fragmentów – Vikky

21

Spróbuj następujący sposób.

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

To może pomóc.

+1

muszę dodać nowy element menu dynamicznie, gdy dany fragment jest załadowany – Vikky

+1

pan sprawdzić [to Pytanie (http://stackoverflow.com/questions/13596113/adding-menu-item-dynamically-from-sherlockactionbar-fragment-tabs)? – Gunaseelan

+0

ya .... teraz mam odpowiedź. – Vikky

1

użycie onPrepareOptionsMenu sposób i wszystko jasne menu pierwszym użyciem

menu.clear(); 

następnie dodać menu.

także refer here .. sprawdzić jego onPrepareOptionsMenu metodę

4

W menu.xml należy dodać wszystkie pozycje menu. Następnie możesz ukryć przedmioty, których nie chcesz widzieć podczas początkowego ładowania.

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

Dodaj setHasOptionsMenu(true) w metodzie onCreate(), aby wywołać pozycje menu w klasie fragmentu.

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

Nie trzeba zastąpić onCreateOptionsMenu w swojej klasie Fragment ponownie. Pozycje menu można zmienić (Dodaj/Remoev) przez przesłonięcie metody onPrepareOptionsMenu dostępnej w Fragment.

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

} 
0

podstawie Gunaseelan odpowiedzieć

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