在保持状态的同时切换片段

2024-01-11

决定重写这个问题:

我有三个片段,称为 A B C。每个片段都有一个视图,其中包含一些字段供用户填写。用户应该能够使用菜单在不同的片段之间切换。如果用户在片段 A 中填写信息,然后切换到 C 填写更多信息,然后切换回 A,则用户在 A 中键入的信息应该仍然存在。

我认为我需要以某种方式使用 FragmentManager,但我无法找出添加/替换/附加的正确组合......这是使其按照我想要的方式工作所需的。

有人可以提供一个代码片段,允许我在片段之间切换,同时维护每个片段的视图状态。

当前工作解决方案:

mContent是活动片段,是活动的私有成员变量。

如果有人发现这种方法有问题或有一种方法可以使其更高效/更强大,请告诉我!

public void switchContent(String fragmentTag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    if ( fragmentManager.findFragmentByTag( fragmentTag ) != mContent ) {
        if ( !mContent.isDetached() ) {
            transaction.detach( mContent );
        }

        if ( fragmentManager.findFragmentByTag( fragmentTag ) == null ) {
            if ( fragmentTag.equals( "details" ) ) {
                mContent = ScheduleDetailsFragment.newInstance();
            } else if ( fragmentTag.equals( "notes" ) ) {
                mContent = ScheduleNotesFragment.newInstance();
            } else if ( fragmentTag.equals( "exceptions" ) ) {
                // @TODO - Create Exceptions Fragment
            }
        } else {
            mContent = ( SherlockFragment ) fragmentManager.findFragmentByTag( fragmentTag );
        }
        if ( mContent.isDetached() ) {
            transaction.attach( mContent );
        } else if ( !mContent.isAdded() ) {
            transaction.add( R.id.content_frame, mContent, fragmentTag );
        }

        transaction.commit();
    }
    getSlidingMenu().showContent();
}

谢谢你, 内森


我基于所提供的示例之一的代码,但每次单击菜单项时它都会返回一个新片段,因此状态信息会丢失。

如果您的页面保留某种形式的状态/会话,则返回一个新的Fragment对于每个导航事件来说,用户体验都很差,而且内存使用情况也不太好。

我建议您的滑动菜单使用FragmentManager在你的主要Activity来维持你的一切Fragments您可以在之间切换。它将管理它们的所有状态,您可以使用findFragmentByTag(String tag)。您只需要确保每个Fragment保存您添加的任何状态(初始创建后更改的值/数据)onSaveInstanceState(Bundle outState)并恢复它onCreate(Bundle savedInstanceState)。我不确定您当前使用的滑动菜单如何管理它,所以这可能是不可能的。希望这至少可以帮助您朝着正确的方向前进。

编辑:更新问题的更新答案 -这是我将如何切换Fragments。通过使用替换,您将完全切换Fragments,同时重用已经创建的。为了让您的片段保存/恢复其状态,您需要参考我上面的答案。如果不清楚,请搜索一些如何保存状态的示例Fragments and Activities.

public void switchContent(String fragmentTag) {

    // If our current fragment is null, or the new fragment is different, we need to change our current fragment
    if (mContent == null || !mContent.getTag().equals(fragmentTag)) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        // Try to find the fragment we are switching to
        Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag);

        // If the new fragment can't be found in the manager, create a new one
        if (fragment == null) {
            if (fragmentTag.equals("details")) {
                mContent = ScheduleDetailsFragment.newInstance();
            }
            else if (fragmentTag.equals("notes")) {
                mContent = ScheduleNotesFragment.newInstance();
            }
            else if (fragmentTag.equals("exceptions")) {
                // @TODO - Create Exceptions Fragment
            }
        }
        // Otherwise, we found our fragment in the manager, so we will reuse it
        else {
            mContent = (SherlockFragment) fragment;
        }

        // Replace our current fragment with the one we are changing to
        transaction.replace(R.id.content_frame, mContent, fragmentTag);
        transaction.commit();

        getSlidingMenu().showContent();
    }
    else {
        // Do nothing since we are already on the fragment being changed to
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在保持状态的同时切换片段 的相关文章

随机推荐

  • 当数据类型为数字时,如何对谷歌图X轴进行排序

    我有一个数据表 第一列是 1 到 48 范围内的数字 Step Pct 1 0 2 0 3 0 4 35 5 45 6 55 7 60 我的代码如下所示 Grid Table is my html table containing the
  • 如何删除超过 (n) 天的文件,但保留 (n) 个文件,无论其年龄如何?

    我用 PHP 编写了以下内容 但我想知道是否有一种优雅的方法可以在 Linux shell 脚本中执行此操作 基本上删除超过 n 天的文件 但保留 n 最新的文件 无论其年龄如何 PHP foreach glob backup db as
  • MySQL - SELECT + JOIN + ORDER BY 性能

    我有两个表 我需要从两个表中选择一些连接的数据 SELECT f FROM file data f JOIN subscriptions s ON f uid s elementid WHERE s uid 119762 AND f pri
  • FFMPEG 套件 iOS 异步调用未异步运行

    当我打电话给executeAsync的方法FFmpegKit我期望异步行为 但代码会运行但从不等待FFmpegKit executeAsync运行 因此 程序输出来自print FFmpeg process exited with stat
  • 将值添加到数据框的所有行

    我有两个熊猫数据框df1 长度为 2 和df2 长度约 30 行 df1 的索引值始终不同 并且不会出现在 df2 中 我想添加来自的列的平均值df1到相应的列df2 示例 将 0 6 添加到 c1 的所有行 将 0 9 添加到 c2 的所
  • 获取 Data.ByteString.Builder 的长度

    我有一个函数tabulate它接受一个对象列表以及将这些对象的字段转换为函数的列表Builders 它返回一个Builder代表一个格式良好的表格 例如 tabulate a gt Builder gt a gt Builder tabul
  • Android Studio 将 2 个 .aar 合二为一

    我有一个 Android Studio 库项目 它依赖于另一个库项目 顶级项目依赖于第二个库项目的代码和资源 当在客户端应用程序中仅使用顶级库项目 aar 时 找不到第二个库项目中的资源 那么在这种情况下我们是否必须始终使用 2 个 aar
  • 使用 PDO 与 Postgresql 连接速度慢

    我正在使用 php7 4 fpm 连接到 PostgreSQL 12 3 Ubuntu 12 3 1 pgdg18 04 1 当我使用 pgadmin4 时 查询在 129 毫秒内执行 结果立即显示在屏幕上 在 php 上执行相同的查询大约
  • Java android AsyncHttpClient 如何设置标头“Accept”“application/xml”或“application/json”

    我不知道如何为 applicatjon json 设置标头 Accept 现在我来自服务器的响应是 xml 但我想要一个 json 当我设置标头时 服务器应该向我发送一个 xml 这是我的代码 final JSONObject reques
  • WPF:动态视图/内容

    我是 WPF 的初学者 所以我问这个 假设我有一个窗口 在窗口内我想要有一些类似容器的东西 可以只是边框 也可以是面板 用 winform 术语来说 容器的内容绑定到所选选项 例如 按钮 因此 例如 当用户选择选项 1 时 容器显示图表 当
  • 做像 Twitter、Hash-Bang #! 这样的链接网址[重复]

    这个问题在这里已经有答案了 可能的重复 Facebook 和新 Twitter URL 中的 shebang hashbang 有何用途 https stackoverflow com questions 3009380 whats the
  • Django表单和html表单有什么区别

    我正在基于 html 表单提交方法来处理我的 django 项目 但最近 我开始知道存在 django 形式 请让我知道它们之间有什么区别 在 Django 中编写表单最终会生成 HTML 表单 Django 表单可以绑定到一个模型 然后该
  • mysql 中的平均时间差

    在我的sql中是否有一个函数可以查找标准时间格式的平均时间差 您可以使用timestampdiff http dev mysql com doc refman 5 1 en date and time functions html func
  • 变量声明与定义

    我正在阅读一些关于外部人员的信息 现在作者开始提到变量的声明和定义 通过声明 他提到了以下情况 如果声明了一个变量 没有为其分配空间 现在这让我感到困惑 因为我认为MOST时代的 当我在 C 中使用变量时 我实际上是在定义和声明它们 对吗
  • 如何使用 Firebase 创建好友列表? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在网上研究如何使用 firebase 创建朋友列表系统 到目前为止 我运气不佳 获得的资源并不完全是我想要的 该应用程序的前提是
  • 无法从 LinkedIn 应用程序获取访问令牌。它在 onActivityResult 中返回 null

    我正在使用 linkedIn android sdk 登录应用程序 但无法获取访问令牌 void startAutheniticate LISessionManager getInstance getApplicationContext i
  • 使用 64 位 llvm-gcc 构建 32 位

    我有 64 位版本的 llvm gcc 但我希望能够构建 32 位和 64 位二进制文 件 有这个标志吗 我尝试传递 m32 适用于常规 gcc 但收到如下错误消息 jay andesite llvm gcc m32 test c o te
  • Angular 9 - 删除 Angular Material Stepper 上的默认图标(创建)

    我在 Angular 中遇到了这个恼人的问题 我通过添加到provides页面的 provide STEPPER GLOBAL OPTIONS useValue displayDefaultIndicatorType false showE
  • Play 商店崩溃报告:android.view.View$DeclaredOnClickListener.onClick 上存在 IllegalStateException

    我的一个应用程序收到了一些 IllegalStateException 的崩溃报告 堆栈跟踪表明它来自 android view View DeclaredOnClickListener onClick view 我在测试或日常使用中从未遇
  • 在保持状态的同时切换片段

    决定重写这个问题 我有三个片段 称为 A B C 每个片段都有一个视图 其中包含一些字段供用户填写 用户应该能够使用菜单在不同的片段之间切换 如果用户在片段 A 中填写信息 然后切换到 C 填写更多信息 然后切换回 A 则用户在 A 中键入