gpt4 book ai didi

android - BottomNavigationView + 在导航到不同选项卡时保存 fragment 状态

转载 作者:行者123 更新时间:2023-12-04 11:45:40 25 4
gpt4 key购买 nike

我正在使用 BottomNavigationView对于底部标签。

1) 选项卡 1 - 从服务器获取数据并显示到 RecyclerView2) 选项卡 2 - 从服务器获取 URL 并加载 Webview3) Tab 3 - 从服务器获取数据并显示到RecyclerView4) 选项卡 4 - 使用 PreferenceFragmentCompat 设置屏幕

为了在用户切换选项卡时保存这些 fragment 的状态,我使用此 blog 中的以下代码

保存 Fragment.SavedStateSparseArray<Fragment.SavedState>

Fragment.State currentFragmentState = getSupportFragmentManager().saveFragmentInstanceState(currentFragment)

当用户导航回以前的选项卡时再次恢复状态
fragment.setInitialSavedState(savedState)

getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container_fragment, fragment, tag)
.commit();

我看到的是只有 Tab 4(设置屏幕与 PreferenceFragmentCompat )保持状态 - 如果我向下滚动到第 10 项并在导航到其他 fragment 后再次返回设置屏幕,我会在顶部看到第 10 位.

但是,前三个选项卡再次调用 Web 服务并重新加载所有内容。另外,我可以看到 Bundle savedInstanceState onCreateView 的参数前三个选项卡的方法也不为空。

我的问题是

1) PreferenceFragmentCompat 怎么做(第 4 个选项卡)自动恢复状态?
2) 如何使用非空 Bundle savedInstanceState ( onCreateView 方法的参数)在前三个选项卡中并像第四个选项卡一样恢复状态?
3)为什么前三个选项卡不会自动恢复状态?

编辑

我使用与 blog 相同的代码做。
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {

switch (item.getItemId()) {

case R.id.navigation_item_1:
swapFragments(new Fragment1(), item.getItemId(), TAG_1);
return true;

case R.id.navigation_item_2:
swapFragments(new Fragment2(), item.getItemId(), TAG_2);
return true;

case R.id.navigation_item_3:
swapFragments(new Fragment3(), item.getItemId(), TAG_3);
return true;

case R.id.navigation_item_4:
swapFragments(new Fragment4(), item.getItemId(), TAG_4);
return true;

default:
return false;
}
}
});

private void swapFragments(Fragment fragment, int itemId, String tag) {
if (getSupportFragmentManager().findFragmentByTag(tag) == null) {
saveFragmentState(itemId, tag);
createFragment(fragment, itemId, tag);
}
}

private void saveFragmentState(int itemId, String tag) {
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container_fragment);
if (currentFragment != null) {
fragmentStateArray.put(currentSelectedItemId, getSupportFragmentManager().saveFragmentInstanceState(currentFragment));
}

currentSelectedItemId = itemId;
}

private void createFragment(Fragment fragment, int itemId, String tag) {
fragment.setInitialSavedState(fragmentStateArray.get(itemId));

getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container_fragment, fragment, tag)
.commit();
}

最佳答案

你现在正在做的是用这段代码替换 fragment

getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container_fragment, fragment, tag)
.commit();

虽然您可以添加 fragment 而不是像这段代码那样替换它们
getSupportFragmentManager()
.beginTransaction()
.add(R.id.container_fragment, fragment, tag)
.commit();

这将做的是添加 fragment 而不是替换它,因此 fragment 状态将被保存。

关于android - BottomNavigationView + 在导航到不同选项卡时保存 fragment 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58655467/

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