android - 如何动态更改 ActionBar 菜单项的图标

标签 android android-actionbar menuitem

我想在收到来自服务器的通知时动态更改菜单项的图标。但是,当更改菜单项图标的代码运行时,我得到了一个 NullPointerException

我用来更改菜单项图标的代码在 onCreatOptionsMenu 方法中定义如下:

 @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);
     }
 }

updateCount 方法中,我按如下方式更改图标:

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);
                        }
                    }
                }
            }                   
        }
    });
}

这是我的菜单项“通知”文件:

<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>

这是我的日志:

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)

请帮忙。

最佳答案

看起来 menu.getItem(index) 返回 null 因为菜单没有膨胀(你检查了 mDrawerLayout != null && isDrawerOpen())或者你可能有index 不存在。您可以使用资源 ID,而不是依赖菜单项索引,还可以检查是否为空:

if (menu != null) {
    MenuItem item = menu.findItem(R.id.your_menu_action);
    if (item != null) {
        item.setIcon(R.drawable.ic_notification1);
    }
}

更新:根据您的代码,我在下面做了一个可行的示例。您可以将其用作基础或进行比较以找出您的代码无法正常工作的原因。我不知道 @layout/action_bar_notification_icon 看起来如何,所以在您的情况下可能存在问题。

在此示例中,一旦您单击菜单项,ic_menu_delete 将被替换为 ic_menu_edit

测试菜单.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/test_menu_item"
        android:icon="@android:drawable/ic_menu_delete"
        android:showAsAction="always"
        android:title="Item1"/>
</menu>

代码:

private Menu menu;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    getMenuInflater().inflate(R.menu.test_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.test_menu_item:
        changeIcon();
        break;

    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

changeIcon() 模拟你的 updateCount()

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);
                }
            }
        }
    });
}

关于android - 如何动态更改 ActionBar 菜单项的图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042070/

相关文章:

android - 设置Android ActionBar的渐变

android - 放弃支持库 v7。我做错了什么?

java - onActivityResult 无法使用 R 中的资源

Android平台支持的硬件架构

Android:ActionBarSherlock 搜索小部件

c# - 如何将单选按钮添加到菜单项?

c# - 如何将 ViewModel(包括分隔符)正确绑定(bind)到 WPF 的菜单?

html - 隐藏在标题 n 内容中的导航菜单下拉菜单

android - 使用 Moshi 和 Retrofit 解析动态字符串对象

Android相机崩溃,重复图像,原生导航按钮搞砸了