Comment faire pour modifier l'ActionBar de l'élément de menu icône dynamiquement
Je veux changer l'icône d'option de menu dynamiquement que je reçois la notification à partir d'un serveur. Cependant, je suis un NullPointerException
lorsque les codes pour modifier l'élément de menu de l'icône exécuter.
Codes que j'ai utilisé pour modifier l'élément de menu de l'icône sont définis dans le onCreatOptionsMenu
méthode comme suit:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//getMenuInflater().inflate(R.menu.main, menu);
this.menu = menu;
if (mDrawerLayout != null && isDrawerOpen())
showGlobalContextActionBar();
MenuInflater menuInflater = this.getMenuInflater();
menuInflater.inflate(R.menu.notification, menu);
return super.onCreateOptionsMenu(menu);
}
}
et dans le updateCount
méthode, je suis l'évolution de l'icône comme suit:
public void updateCount(int count) {
hot_count = count;
System.out.println("Value of count: " + count);
runOnUiThread(new Runnable() {
@Override
public void run() {
//TODO Auto-generated method stub
if (hot_count > 0) {
if(hot_count>0)
{
if (menu != null) {
MenuItem item = menu.findItem(R.id.menu_hotlist);
if (item != null) {
item.setIcon(R.drawable.ic_notification1);
}
}
}
}
}
});
}
Voici mon menuitem "notification"fichier.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<item android:id="@+id/menu_hotlist"
android:actionLayout="@layout/action_bar_notification_icon"
android:showAsAction="always"
android:icon="@drawable/ic_notification"
android:title="Notification" />
</menu>
Voici mon logcat:
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)
S'il vous plaît aider.
OriginalL'auteur ankur arora | 2015-01-20
Vous devez vous connecter pour publier un commentaire.
Ressemble
menu.getItem(index)
est de retour nulle, car le menu n'était pas gonflé ( vous devez vérifiermDrawerLayout != null && isDrawerOpen()
) ou vous pourriez avoirindex
qui n'existe pas. Au lieu de s'appuyer sur menu index de l'élément, vous pouvez utiliser l'id de ressource, également faire vérifier la valeur null:Mise à jour: basé sur vous code que j'ai fait l'exemple ci-dessous qui fonctionne. Vous pouvez l'utiliser comme base ou pour comparer à trouver pourquoi ton code ne fonctionne pas. Je ne sais pas comment
@layout/action_bar_notification_icon
les regards comme si dans votre cas, peut-être un problème.Dans cet exemple
ic_menu_delet
e est remplacé paric_menu_edit
une fois que vous cliquez sur l'élément de menu.test_menu.xml
Code:
changeIcon() simule votre updateCount()
Assurez-vous que le point.setIcon() est appelée. Si elle n'est pas, vérifier pourquoi.
menu retourne null
Est menuInflater.inflate() appelé et vous êtes de passage correct de la ressource?
oui, il l'appelait.
OriginalL'auteur Dario
J'ai aussi eu le même problème et @Dario réponses fonctionne comme un charme aussi longtemps que vous ne l'appelez pas
invalidateOptionsMenu()
Pour résoudre ce problème, je attribuer le drawable des ressources à une variable et appel
invalidateOptionsMenu()
où je veux changer l'icône et j'ai mis l'icône dansonCreateOptionsMenu()
. Le code devrait ressembler à ceci:OriginalL'auteur Zinc
J'ai eu le même problème. Assurez-vous d'avoir les lignes suivantes dans votre élément de menu (une icône et showAsAction toujours) :
OriginalL'auteur Ana_Maria
Il y a 3 étapes:
MenuItem
variable .onCreateOptionsMenu
méthode affecter votre valeur (la ciblemenu).
le changement de l'icône lorsque requis.
OriginalL'auteur sepehr