salut je crée une application qui est une application à onglets.
dans ma maison qui étend sherlockFragmentActivity, je gonfle menu.xml et inclut le code de l'écouteur de clic optionMenuitem. Le Fragmentactivity contient tabhost et sur chaque onglet il charge des fragments. c'est mon 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>
et voici mes méthodes onCreateOptionMenu et onOptionItemSelected dans la classe 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;
}
et ceci est ma méthode 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;
}
j'ai besoin d'ajouter des menus en fonction du changement d'onglet. c'est sur le changement d'onglet que je charge différents fragments et lorsque les fragments changent, je dois ajouter de nouveaux éléments au menu. mon ListFrag qui étend SherlockFragment et il se charge lorsque je clique sur le 3ème onglet. lorsque ce fragment se charge, je dois ajouter 1 élément de menu au menu
Essayez la méthode suivante.
@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);
}
Cela peut vous aider.
Dans le menu.xml
, Vous devez ajouter tous les éléments de menu. Ensuite, vous pouvez masquer les éléments que vous ne souhaitez pas voir lors du chargement initial.
<item
Android:id="@+id/action_newItem"
Android:icon="@drawable/action_newItem"
Android:showAsAction="never"
Android:visible="false"
Android:title="@string/action_newItem"/>
Ajoutez setHasOptionsMenu(true)
dans la méthode onCreate () pour appeler les éléments de menu de votre classe Fragment.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
Vous n'avez plus besoin de remplacer onCreateOptionsMenu
dans votre classe Fragment. Les éléments du menu peuvent être modifiés (Ajouter/supprimer) en remplaçant onPrepareOptionsMenu
méthode disponible dans Fragment.
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_newItem).setVisible(true);
super.onPrepareOptionsMenu(menu);
}
voici un exemple ... ça pourrait vous aider ...
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;
basé sur la réponse de 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;
}
utilisez la méthode onPrepareOptionsMenu
et effacez d'abord tous les menus en utilisant
menu.clear();
puis ajoutez le menu.
Aussi voir ici .. vérifiez sa méthode onPrepareOptionsMenu