Har*_*789 5 android android-fragments android-design-library bottomnavigationview
我BottomNavigationView用于底部标签。
1) Tab 1 - 从服务器获取数据并显示到RecyclerView
2) Tab 2 - 从服务器获取 URL 并加载Webview
3) Tab 3 - 从服务器获取数据并显示到RecyclerView
4) Tab 4 - 设置屏幕使用PreferenceFragmentCompat
为了在用户切换选项卡时保存这些片段的状态,我使用了此博客中的以下代码
保存Fragment.SavedState到SparseArray<Fragment.SavedState>
Fragment.State currentFragmentState = getSupportFragmentManager().saveFragmentInstanceState(currentFragment)
Run Code Online (Sandbox Code Playgroud)
当用户导航回之前的选项卡时再次恢复状态
fragment.setInitialSavedState(savedState)
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container_fragment, fragment, tag)
.commit();
Run Code Online (Sandbox Code Playgroud)
我看到的是只有 Tab 4(设置屏幕 PreferenceFragmentCompat)保持状态 - 如果我向下滚动到第 10 个项目并在导航到其他片段后再次返回设置屏幕,我会在顶部看到第 10 个位置。
但是,前三个选项卡会再次调用 Web 服务,并且所有内容都会重新加载。另外,我可以看到前三个选项卡Bundle savedInstanceState的onCreateView方法参数也不为空。
我的问题是
1) PreferenceFragmentCompat(4th tab ) 如何自动恢复状态?
2)如何在前三个选项卡中使用非空Bundle savedInstanceState(onCreateView方法的参数)并像第四个选项卡一样恢复状态?
3)为什么前三个选项卡没有自动恢复状态?
编辑
我使用与博客相同的代码。
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();
}
Run Code Online (Sandbox Code Playgroud)
您现在正在做的是用这段代码替换片段
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container_fragment, fragment, tag)
.commit();
Run Code Online (Sandbox Code Playgroud)
虽然您可以添加片段而不是像下面的代码那样替换它们
getSupportFragmentManager()
.beginTransaction()
.add(R.id.container_fragment, fragment, tag)
.commit();
Run Code Online (Sandbox Code Playgroud)
这将添加片段而不是替换它,因此片段状态将被保存。
| 归档时间: |
|
| 查看次数: |
3681 次 |
| 最近记录: |