actionbar出现java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to 的解决办法

上网查大致是同一界面有两个相同id的view(包含menuitem),导致恢复状态时出现类型转换异常。

但是从我的代码中找不到有相同id的地方。

我的部分代码:

创建菜单:

public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		getMenuInflater().inflate(R.menu.reload, menu);
		return true;
	}
设置actionbar上的menuItem:

MenuItemCompat.setActionView(refreshItem,new ProgressBar(this));

可见我设置menuitem的时候直接new ProgressBar,那么这个progressBar是没有id的,这样的话onRestoreInstanceState就不会恢复这个progressBar 的状态。

但是从异常来看,确实是把这个progressBar恢复过来了。

然后我跟踪onSaveInstanceState的调用流程,最终发现在com.android.internal.view.menu.MenuItemImpl.java这个类

public MenuItem More ...setActionView(View view) {
554        mActionView = view;
555        mActionProvider = null;
556        if (view != null && view.getId() == View.NO_ID && mId > 0) {
557            view.setId(mId);
558        }
559        mMenu.onItemActionRequestChanged(this);
560        return this;
561    }
看556行,如果view没有id,就把menu的id射上去。。。尼玛坑爹啊!你随机生成一个id也行啊。干嘛和当前menu id一样啊!这样menu和progressBar都一个id了。这下好了,crash出现了!
解决办法:menu的actionView ,记得把id加上



你可能感兴趣的:(android)