更新:从支持库的22.2.1版本开始,此问题已得到解决,不再需要使用下面提到的解决方法保存/恢复视图状态
不要使用NavigationView.SavedState
NavigationView是将saveEnabled设置为true的视图.
这意味着视图本身应在内部使用SavedState来自动保存/恢复其状态(例如,设备旋转时)
不幸的是,该视图具有已确认的错误,并且状态未正确保存/恢复:
https://code.google.com/p/android/issues/detail?id=175224
here您将找到针对该问题的更通用的解决方法:
public void onSaveInstance(Bundle outState) {
ArrayList positions = findSelectedPosition();
if(positions.size()>0) {
outState.putIntegerArrayList(STATE_SELECTED_POSITION, positions);
}
}
private ArrayList findSelectedPosition() {
Menu menu = navDrawerFirstPart.getMenu();
int count = menu.size();
ArrayList result = new ArrayList<>();
for (int i = 0; i < count; i++) {
if(menu.getItem(i).isChecked()){
result.add(i);
}
}
return result;
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
if(savedInstanceState.containsKey(STATE_SELECTED_POSITION)){
restoreSelectedPosition(savedInstanceState.getIntegerArrayList(STATE_SELECTED_POSITION));
}
}
private void restoreSelectedPosition(ArrayList positions) {
Menu menu = navDrawerFirstPart.getMenu();
for(int i=0; i
menu.getItem(positions.get(i)).setChecked(true);
}
}
使用NavigationView.SavedState在此解决方案上没有优势,因为状态
存储在其中,它是一个简单的Bundle,NavigationView在其中存储了来自项目的检查状态的SparseBooleanArray.
除此之外,启动在NavigationView中保存实例的所有过程的函数是:
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
NavigationView.SavedState state = new NavigationView.SavedState(superState);
state.menuState = new Bundle();
this.mMenu.savePresenterStates(state.menuState);
return state;
}
请注意,savePresenterStates是内部类MenuBuider:的一部分,因为它是公共的,因此它是可见的,但是由于它是内部类,因此请再次注意,不要在支持库的包外部对其进行访问.除此之外,该功能产生的捆绑包是错误的,因为这是问题的根源.