android 得到view的状态,android-在NavigationView上保存状态

更新:从支持库的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:的一部分,因为它是公共的,因此它是可见的,但是由于它是内部类,因此请再次注意,不要在支持库的包外部对其进行访问.除此之外,该功能产生的捆绑包是错误的,因为这是问题的根源.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值