我设置了一个加载器,在其中我尝试在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
有没有人之前遇到过这个问题,或者能够知道为什么会出现这个问题?
答案 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));
}