web-dev-qa-db-fra.com

Modification de l’icône du menu des options dans la barre d’action en fonction d’un fragment ouvert

J'ai cet article dans mon menu d'options:

<item
    Android:id="@+id/opt_mnu_action"
    Android:icon="@Android:drawable/ic_dialog_info"
    Android:orderInCategory="1"
    Android:showAsAction="ifRoom"
    Android:title="New">
</item>

Le menu lui-même créé dans FragmentActivity principal. Je souhaite modifier l'icône de cet élément par programmation en fonction du fragment ouvert et, évidemment, avoir des actions différentes lorsque l'utilisateur clique sur ce bouton. J'ai essayé plusieurs choses pour le faire, mais rien n'a fonctionné. La dernière chose que j'ai essayée était ce code dans la méthode onCreateView de mon fragment:

MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);

Mais mon application s'est écrasée. Alors, y a-t-il un moyen de faire ça?

** UPDATE **

Voici ce que j'essaie de faire maintenant, tout dans mon principal FragmentActivity: Tout d'abord, j'ai un MenuItem action_button; dans ma vue hiérarchique. Puis, dans ma méthode onCreateOptionsMenu, je l'instancie:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    action_button = menu.findItem(R.id.opt_mnu_action);
    return super.onCreateOptionsMenu(menu);
}

Ensuite, j'ai créé cette fonction pour changer l'icône en fonction de l'onglet ouvert:

public void change_action_button_icon(int tab_position)
{
    switch(tab_position)
    {
    case 0:
        action_button.setIcon(R.drawable.ico_1);
        break;
    case 1:
        action_button.setIcon(R.drawable.ico_2);
        break;
    case 2:
        action_button.setIcon(R.drawable.ico_3);
        break;
    }
    invalidateOptionsMenu();
}

Et je l'appelle dans ma méthode onTabSelected:

public void onTabSelected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
    mViewPager.setCurrentItem(tab.getPosition());
    setTab_position(tab.getPosition());
    change_action_button_icon(tab.getPosition());
}

Mais une fois que je lance mon application, elle se bloque. Je reçois une erreur NullPointerException à cette ligne:

action_button.setIcon(R.drawable.ico_1);

À mon avis, cela se produit parce que le changement d’icône a été demandé avant l’instanciation du action_button. Mais je ne sais pas comment le surmonter ...

13
Igal

Utilisez ceci pour obtenir une référence à l'élément de menu:

    menu.findItem(resourceId).setIcon(drawableId);

Vous devez mettre le code pour changer l'icône dans onCreateOptionsMenu ().

Veuillez vous référer à mon exemple ci-dessous:

    public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    getMenuInflater().inflate(R.menu.option_menu, menu);

    if (needToChangeMenuItem){

        menu.findItem(resourceId).setIcon(drawableId);
    }

    manageMenuIcon(menu);

    needToChangeMenuItem = false;


    return true;
}


    public void manageMenuIcon(Menu menu){
    if (bluetoothIconOn){
        menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothon);
    } else
        menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothoff);

    if (gpsIconOn)
        menu.findItem(R.id.gps).setIcon(R.drawable.gps);
    else
        menu.findItem(R.id.gps).setVisible(false);

    if (slipAndDropIconOn)
        menu.findItem(R.id.fall).setIcon(R.drawable.fall);
    else
        menu.findItem(R.id.fall).setVisible(false);

    if (fesConnectIconOn)
        menu.findItem(R.id.fesConnection).setIcon(R.drawable.fesconnect);
    else
        menu.findItem(R.id.fesConnection).setVisible(false);


}


    public void changeMenuItem(int resId, int draId){


    needToChangeMenuItem = true;
    resourceId = resId;
    drawableId = draId;

    invalidateOptionsMenu();        


}
18
ksu
MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);

Dans la variable onCreateOptionsMenu de votre fragment, chargez ce menu et conservez une référence à l'élément de menu (il ne fait pas partie de la hiérarchie de vue du fragment et vous ne pouvez donc pas utiliser findViewById).

Lorsque vous êtes prêt à mettre à jour l'icône, utilisez mi.setIcon(R.drawable.ico_1); Et appelez invalidateOptionsMenu().

MIS À JOUR:

return super.onCreateOptionsMenu(menu);

Cela retournera en réalité faux, car l'implémentation de base ne le fera pas. Au lieu de cela, ignorez-le ou appelez simplement super.onCreateOptionsMenu(menu);, faites votre travail puis renvoyez true.

0
f2prateek

Commencez par ajouter actionOverFlowButtonStyle dans votre thème principal.

<style name="AppTheme" parent="AppBaseTheme">

    <item name="Android:actionOverflowButtonStyle">@style/MyActionButtonOverflow</item>
</style>

Définir le bouton Nouveau style d'action sur le flux

<style name="MyActionButtonOverflow" parent="Android:style/Widget.Holo.Light.ActionButton.Overflow">
    <item name="Android:src">@drawable/ic_menu</item>
</style>