Как мы можем добавить пункт меню динамически

Hi frnds создает приложение, которое является приложением табуляции.

В моем Доме, который расширяет sherlockFragmentActivity, я раздуваю menu.xml и включаю код для опции clickener. 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 в классе 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; } 

И это мой метод 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 пункт меню в меню

Solutions Collecting From Web of "Как мы можем добавить пункт меню динамически"

Попробуйте следующее.

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

Это может вам помочь.

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

Вам больше не нужно переопределять onCreateOptionsMenu в своем классе фрагментов. Элементы меню могут быть изменены (Add / remoev), переопределив onPrepareOptionsMenu доступный в Fragment.

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

Вот пример … это может помочь вам …

  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; 

Используйте метод onPrepareOptionsMenu и сначала очистите все меню

 menu.clear(); 

Затем добавьте меню.

Также см. Здесь .. проверьте его метод onPrepareOptionsMenu