方法 1: 添加并显示/隐藏 Fragment
你可以使用事务添加多个 Fragment 到同一个容器中,然后通过显示或隐藏不同的 Fragment 来达到切换的效果。
private void updateFragments(Fragment selectedFragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 遍历所有已添加的Fragment,将它们全部隐藏
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment != null) {
fragmentTransaction.hide(fragment);
}
}
}
// 显示选中的Fragment
if (selectedFragment != null) {
String tag = selectedFragment.getClass().getSimpleName();
// 查找已存在的Fragment
Fragment existingFragment = fragmentManager.findFragmentByTag(tag);
if (existingFragment != null) {
fragmentTransaction.show(existingFragment);
// 强制重新加载数据
existingFragment.requireActivity().runOnUiThread(() -> ((YourFragmentClass) existingFragment).loadData());
} else {
// 添加新的Fragment
fragmentTransaction.add(R.id.fragment_container_view, selectedFragment, tag);
// 强制重新加载数据
selectedFragment.requireActivity().runOnUiThread(() -> ((YourFragmentClass) selectedFragment).loadData());
}
}
// 提交事务
try {
fragmentTransaction.commit();
} catch (IllegalStateException e) {
// 处理事务提交失败的情况,例如Activity已被销毁
Log.e("FragmentManager", "Failed to commit transaction", e);
}
}
方法 2: 替换并移除旧的 Fragment
如果你希望每次切换时都保留一个新的 Fragment 并移除旧的 Fragment,可以这样做:
1private void updateFragments(Fragment selectedFragment) {
2 if (selectedFragment != null) {
3 FragmentManager fragmentManager = getSupportFragmentManager();
4 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
5
6 // 移除旧的Fragment
7 Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragment_container_view);
8 if (currentFragment != null && currentFragment != selectedFragment) {
9 fragmentTransaction.remove(currentFragment);
10 }
11
12 // 添加新的Fragment
13 fragmentTransaction.add(R.id.fragment_container_view, selectedFragment);
14
15 fragmentTransaction.commit();
16 }
17}
注意事项
- 当使用
show
和hide
方法时,你需要确保所有的 Fragment 都已经通过add
方法添加到容器中。 - 使用
remove
方法时要小心,因为它会从 FragmentManager 中完全移除 Fragment。如果你之后还想重新显示某个 Fragment,那么需要再次创建它。 - 无论哪种方法,都要确保 FragmentTransaction 正确地提交了事务。
选择哪种方法取决于你的具体需求。如果你只是想简单地切换当前显示的 Fragment,而不需要保留所有 Fragment 的状态,那么第二种方法可能是更好的选择。如果你需要多个 Fragment 共存,并且可以在任何时候切换回来,那么第一种方法会更适合。