我设置了一个加载器,我尝试在其中设置onLoadDone()方法的操作栏中的项目图标,但是在尝试这样做时出现空指针异常。
但是,如果我不尝试在onLoadDone()方法中执行此操作,则可以更改图标。
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()
,因为菜单布局未膨胀。您可以创建一个全局 Menu 变量并在 onCreateOptionsMenu() 中初始化它,然后在您的 onLoadFinished()
中使用它。
private Menu menu;
在你的onCreateOptionsMenu()
this.menu = menu;
在你的 onLoadDone() 方法中
menu.getItem(0).setIcon(getResources().getDrawable(R.drawable.ic_launcher));
我遇到了同样的问题,这让我发疯了。简而言之,不能保证(取决于 API 版本)菜单(及其项目)将由 OnCreate 加载,这就是您获得 NPE 的原因。
我通过将更改的所有逻辑放在onCreateOptionsMenu部分内的菜单中来解决它。 例如:
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));
}