Fragment两种切换方式

方法 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}

注意事项

  • 当使用 showhide 方法时,你需要确保所有的 Fragment 都已经通过 add 方法添加到容器中。
  • 使用 remove 方法时要小心,因为它会从 FragmentManager 中完全移除 Fragment。如果你之后还想重新显示某个 Fragment,那么需要再次创建它。
  • 无论哪种方法,都要确保 FragmentTransaction 正确地提交了事务。

选择哪种方法取决于你的具体需求。如果你只是想简单地切换当前显示的 Fragment,而不需要保留所有 Fragment 的状态,那么第二种方法可能是更好的选择。如果你需要多个 Fragment 共存,并且可以在任何时候切换回来,那么第一种方法会更适合。

相关推荐
方也_arkling6 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮6 小时前
Spring Bean作用域与生命周期全解析
java·spring
Chengbei116 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1126 小时前
web-第一次课后作业
java·开发语言·idea
秋97 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本7 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
DIY源码阁7 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
Meteors.7 小时前
安卓源码阅读——01.grade设置binding为true时,xml如何进行映射
android·xml
_李小白8 小时前
【android opencv学习笔记】Day 26: 滤波算法之低通滤波与图像缩放插值
android·opencv·学习
basketball6168 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++