Android 尝试在加载程序中设置菜单项图标时出现空指针异常

Android 尝试在加载程序中设置菜单项图标时出现空指针异常,android,Android,我设置了一个加载器,在其中我尝试在onLoadFinished()方法的操作栏中设置一个项目的图标,但是在尝试这样做时,我得到了一个空指针异常 但是,如果我不尝试在onLoadFinished()方法中更改图标,则可以更改图标 ActionMenuItemView actionBarMenuItem = (ActionMenuItemView) findViewById(R.id.action_item); actionBarMenuItem.setIcon(getResources().get

我设置了一个加载器,在其中我尝试在onLoadFinished()方法的操作栏中设置一个项目的图标,但是在尝试这样做时,我得到了一个空指针异常

但是,如果我不尝试在onLoadFinished()方法中更改图标,则可以更改图标

ActionMenuItemView actionBarMenuItem = (ActionMenuItemView) findViewById(R.id.action_item);
actionBarMenuItem.setIcon(getResources().getDrawable(R.drawable.ic_my_icon));

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.internal.view.menu.ActionMenuItemView.setIcon(android.graphics.drawable.Drawable)' on a null object reference

是否有人以前遇到过此问题,或者能够知道其发生的原因?

您不能在onCreate中的菜单项上使用
findViewById()
,因为菜单布局没有膨胀。您可以创建一个全局菜单变量,并在onCreateOptions菜单()中初始化它,然后在
onLoadFinished()中使用它

在OnCreateOptions菜单()中

在onLoadFinished()方法中


我也有同样的问题,这让我发疯。简言之,无法保证(取决于API版本)菜单(及其项)将由OnCreate加载,这就是您获得NPE的原因

我通过将菜单中的所有更改逻辑放在onCreateOptions菜单部分中解决了这个问题。例如:

if (clientcount >=2)
{
    menuOnline.setIcon(getResources().getDrawable(R.drawable.online));
}
else {
    menuOnline.setIcon(getResources().getDrawable(R.drawable.offline));
}
设置clientcount后,我调用InvalidateOptions菜单,从而确保正确加载菜单。
这为我解决了问题

我这样绕过了它。也许它是弯曲的,但它似乎起作用:

 public void syncStatus(final String input){
    if (mMenu == null){
        //wait 1 sec
        new CountDownTimer(1000, 1000) {

            public void onTick(long millisUntilFinished) {

            }

            public void onFinish() {
                //retry method
                syncStatus(input);
            }

        }.start();
        return;
    }
    mMenu.getItem(0).setIcon(ContextCompat.getDrawable(this, R.drawable.sync_off));
    }

您可以从onCreateOptionMenu函数启动加载程序
menu.getItem(0).setIcon(getResources().getDrawable(R.drawable.ic_launcher));
if (clientcount >=2)
{
    menuOnline.setIcon(getResources().getDrawable(R.drawable.online));
}
else {
    menuOnline.setIcon(getResources().getDrawable(R.drawable.offline));
}
 public void syncStatus(final String input){
    if (mMenu == null){
        //wait 1 sec
        new CountDownTimer(1000, 1000) {

            public void onTick(long millisUntilFinished) {

            }

            public void onFinish() {
                //retry method
                syncStatus(input);
            }

        }.start();
        return;
    }
    mMenu.getItem(0).setIcon(ContextCompat.getDrawable(this, R.drawable.sync_off));
    }