gpt4 book ai didi

android - 在 NavigationView 上保存状态

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:33 24 4
gpt4 key购买 nike

我正在使用新的 NavigationView , 试图将其实现为 DrawerLayout ,我想将当前选择的菜单项保存在 NavigationView 的菜单中。我知道我可以通过保存/恢复我的实例状态来“手动”保存/恢复所选项目:

public class MyActivity extends AppCompatActivity {
private static String STATE_SELECTED_POSITION = "state_selected_position";
private int mCurrentSelectedPosition;

private NavigationView mNavigationView;
private FrameLayout mContentFrame;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
mContentFrame = (FrameLayout) findViewById(R.id.content_frame);

mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);

switch(menuItem.getItemId()) {
case R.id.navigation_item_1:
Snackbar.make(contentFrame, "Item One", Snackbar.LENGTH_SHORT).show();
mCurrentSelectedPosition = 0;
return true;
case R.id.navigation_item_2:
Snackbar.make(contentFrame, "Item Two", Snackbar.LENGTH_SHORT).show();
mCurrentSelectedPosition = 1;
return true;
default:
return false;
}
}
});
}

// Saving the currently selected menu item (index).
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
}

// Restoring selected menu item.
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);

mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION, 0);
mNavigationView.getMenu().getItem(mCurrentSelectedPosition).setChecked(true);
}

}

我偶然发现了 NavigationView.SavedState ,希望这是一个更好的解决方案,但我无法弄清楚如何将其实现到我的 Activity 中。谁能帮我弄清楚如何实现这个?谢谢。

最佳答案

更新:从支持库的 22.2.1 开始,该问题已得到修复,不再需要使用下面提到的解决方法来保存/恢复 View 状态


不要使用NavigationView.SavedState

NavigationViewsaveEnabled 设置为 true 的 View 。这意味着 SavedState 应该由 View 本身在内部使用以自动保存/恢复其状态(例如:在设备旋转时)不幸的是,该 View 有一个已确认的错误,并且未正确保存/恢复状态: 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<Integer> positions) {
Menu menu = navDrawerFirstPart.getMenu();
for(int i=0; i<positions.size(); 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 的一部分:是公共(public)的,因此它是可见的,但又因为它是内部类,不应在外部访问支持库的包。除此之外,来自该函数的 bundle 是错误的,因为它是问题的根源。

关于android - 在 NavigationView 上保存状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30592080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com