10
votes

Comment changer l'icône de l'élément de menu de la barre d'action de manière dynamique

Je veux modifier l'icône de l'élément de menu de manière dynamique lorsque je reçois une notification d'un serveur. Cependant, je reçois un nullpointerexception code> lorsque les codes permettent de modifier l'icône de l'élément de menu.

Les codes que j'ai utilisés pour modifier l'icône de l'élément de menu sont définis dans le OncreateOptionsMenu code> Méthode comme suit: p> xxx pré>

et dans la méthode code> updateCount code>, je modifie l'icône comme suit: p> xxx Pré>

Voici mon fichier "Notification" My Menuitem: P>

01-20 15:03:29.811: E/AndroidRuntime(10318): java.lang.NullPointerException
01-20 15:03:29.811: E/AndroidRuntime(10318):    at com.xsinfosol.helpdesk_customer.TAB_Activity$3.run(TAB_Activity.java:294)
01-20 15:03:29.811: E/AndroidRuntime(10318):    at android.os.Handler.handleCallback(Handler.java:730)
01-20 15:03:29.811: E/AndroidRuntime(10318):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-20 15:03:29.811: E/AndroidRuntime(10318):    at android.os.Looper.loop(Looper.java:137)
01-20 15:03:29.811: E/AndroidRuntime(10318):    at android.os.HandlerThread.run(HandlerThread.java:61)
01-20 15:04:04.881: I/System.out(11629)


0 commentaires

4 Réponses :


10
votes

ressemble à menu.getem (index) code> renvoie null car le menu n'a pas été gonflé (vous avez vérifier mdrawerlayout! = null && isdraweropen () code>) ou vous aurez peut-être pu index code> qui n'existe pas. Au lieu de s'appuyer sur l'index de l'élément de menu, vous pouvez utiliser l'ID de ressource, vérifiez également NULL:

public void changeIcon(){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (menu != null) {
                MenuItem item = menu.findItem(R.id.test_menu_item);
                if (item != null) {
                    item.setIcon(android.R.drawable.ic_menu_edit);
                }
            }
        }
    });
}


9 commentaires

J'ai mis en œuvre votre code mais cela ne change pas l'icône. Monsieur, dites-moi comment changer d'icône.


Assurez-vous que l'article.Seticon () est appelé. Si ce n'est pas le cas, vérifiez pourquoi.


Le menu renvoie null


Menuinflater.inflate () est-il appelé et vous passez à une ressource correcte?


Mettez à jour votre message initial avec code mis à jour et joignez également la ressource de menu.


Je vois maintenant que dans le code posté dans OncreateOptionsMenu (), vous avez une erreur de compilation car le drapeau booléen est uniquement rétabli en cas de déclaration. Vous voulez probablement retourner vrai au lieu d'appeler super ici aussi.


Voulez-vous s'il vous plaît élaborer?


Pour tester, essayez avec ceci: public booléen oncreeeoptionsMenu (menu Menu) {this.menu = menu; getmenuinflater (). Gonflez (R.Menu.notification, menu); retourne vrai; }


@ ANKUR-ARORA Peut-être que vous appelez un endroit à InvalidateOptionsMenu () . Il pourrait être de restaurer l'icône à sa valeur par défaut



0
votes

J'ai eu le même problème. Veuillez vous assurer que vous avez les éléments suivants dans votre élément de menu (une icône et une définition d'une icône et d'une image d'affichage pour toujours): xxx


0 commentaires

6
votes

J'ai aussi eu le même problème et @Dario répond fonctionne comme un charme tant que vous n'appelez pas InvalidateOptionsMenu ()

Pour résoudre ce problème, j'ignifie la ressource dessinable à une variable et un appel invalidateOptionsMenu () où je veux changer l'icône et je définirai l'icône dans oncreateOptionsMenu () . Le code devrait être comme celui-ci: xxx


2 commentaires

Excellente solution mon ami! +1


1+ super classique!



0
votes

Il y a 3 étapes:

  1. Définissez un Menuitem global variable.
  2. dans OncreateOptionsMenu Méthode Attribuez votre valeur (la cible menu) à elle.
  3. Modifiez l'icône lorsque vous avez besoin. XXX


0 commentaires