上网查大致是同一界面有两个相同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));
但是从异常来看,确实是把这个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出现了!