我想在收到来自服务器的通知时动态更改菜单项的图标。但是,当更改菜单项图标的代码运行时,我得到了一个 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_delet
e 将被替换为 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/