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

时间:2014-12-08 21:23:46

标签: android

我设置了一个加载器,在其中我尝试在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

有没有人之前遇到过这个问题,或者能够知道为什么会出现这个问题?

3 个答案:

答案 0 :(得分:1)

您无法在onCreate上的菜单项上使用findViewById(),因为菜单布局没有充气。您可以创建一个全局Menu变量并在onCreateOptionsMenu()中初始化它,然后在onLoadFinished()中使用它。

private Menu menu;

在你的onCreateOptionsMenu()

this.menu = menu;

在你的onLoadFinished()方法中

menu.getItem(0).setIcon(getResources().getDrawable(R.drawable.ic_launcher));

答案 1 :(得分:1)

我遇到了同样的问题,这让我很生气。简而言之,无法保证(取决于API版本)菜单(及其项目)将由OnCreate加载,这就是您获得NPE的原因。

我通过在onCreateOptionsMenu部分的菜单中放置所有更改逻辑来解决它。 E.g:

if (clientcount >=2)
{
    menuOnline.setIcon(getResources().getDrawable(R.drawable.online));
}
else {
    menuOnline.setIcon(getResources().getDrawable(R.drawable.offline));
}

设置 clientcount 后,我调用invalidateOptionsMenu,从而确保正确加载菜单。 这解决了我。

答案 2 :(得分:0)

我以这种方式绕过了它。也许它歪了,但它似乎可以工作:

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