web-dev-qa-db-fra.com

comment ajouter dynamiquement un élément de menu

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

14
Vikky

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.

25
Gunaseelan

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 onPrepareOptionsMenuméthode disponible dans Fragment.

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

}
7

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;
3
ashish.n

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;
}
1
Lotfi

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

1
CRUSADER