Android 同时使用 getFragmentManager 和 getSupportFragmentManager 会导致重叠

2024-01-14

我的活动中有这样的内容:

@Override
    public void onNavigationDrawerItemSelected(int position) {
        Fragment fragment = null;
        switch (position+1) {
            case 1: {
                fragment = new Fragment_Login();
                FragmentManager frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.container, fragment)
                        .commit();
                break;
            }
            case 2: {
                SwipeRefreshListFragment swipeFragment = new Fragment_List_Of_Assessments();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.container, swipeFragment)
                        .commit();
                break;
            }
            case 3: {
                fragment = new Fragment_Report();
                FragmentManager frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.container, fragment)
                        .commit();
                break;
            }
            case 4: {
                fragment = new Fragment_Settings();
                FragmentManager frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.container, fragment)
                        .commit();
                break;
            }
            default:
                break;
        }
    }

程序会自动加载case1,但是当选择case2时,getSupportFragmentManager会在case1之上加载Fragment。我猜想同时使用 supportFragmentManager 和 FragmentManager 会出现一些问题。他们似乎有自己的堆栈。问题是我不能只使用其中之一,因为 SwipeToRefresh Android 示例使用 ListView ,它需要 support.v4.Fragment ,而 support.v4.Fragment 需要旧的 FragmentManager 。那么如何将两个 FragmentManager 集成在一起呢?


我在使用 PreferenceFragment 时完成了类似的事情(不受支持库版本支持)。为了实现这一目标,我在 Activity 中保留了一对布尔值 (isLastFragmentSupportType and lastFragmentShowed) 以及一个字符串 (lastFragmentTag).

一开始你的 Activity 会将它们都设置为 false。当你添加一个新的片段时,你使用这两个布尔值来知道是否需要清理另一个FragmentManager或不。我将使用您的代码作为示例:

@Override
public void onNavigationDrawerItemSelected(int position) {
    Fragment fragment = null;
    switch (position+1) {
        case 1: {
            if(isLastFragmentSupportType && lastFragmentShowed)
            {//As your last fragment  was a support type you need to clear your supportFragmentManager
              android.support.v4.app.Fragment fr_v4 = getSupportFragmentManager().findFragmentByTag(lastFragmentTag);
               getSupportFragmentManager().beginTransaction().remove(fr_v4).commit();
            }
            fragment = new Fragment_Login();
            FragmentManager frgManager = getFragmentManager();
            frgManager.beginTransaction().replace(R.id.container, fragment,TAG1)
                    .commit();
          lastFragmentTag = TAG1;
          lastFragmentShowed = true;
          isLastFragmentSupportType = false; 
            break;
        }
       //And so on with the others

您需要检查要使用的片段类型(支持或不支持),并检查这些变量以查看最后一个片段是否属于不同类型。如果是这种情况,请清理其他片段管理器以“清除”屏幕,这样它们就不会重叠。

还可以使用标签来识别和检索当前的片段,这样您就不需要Fragment代码中的变量。

最后使用onSavedInstanceState以便保留这些值以备不时之需。

希望能帮助到你 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 同时使用 getFragmentManager 和 getSupportFragmentManager 会导致重叠 的相关文章

  • 在解决依赖关系之前运行 gradle 任务

    我想运行一个 gradle 任务 在 gradle 尝试解决依赖关系之前获取其他源并设置它们 在 build gradle 中有一个任务 用于获取子项目的源代码 该任务需要在 Gradle 尝试解决依赖关系之前运行 因为子项目是依赖关系的一
  • Android-ListView-performItemClick

    当我尝试使用时遇到一些困难执行项目单击ListView 的功能 我想要做的就是以编程方式在列表的第一项中执行单击 我怎样才能做到这一点 我在文档中查找了该函数 但我并不真正理解它的参数 我尝试过类似的事情 myListView perfor
  • 是否仍然建议使用 AsyncTask 在后台加载 listView 项目?

    背景 我听说有一些在后台加载数据的新解决方案比 AsyncTask 更值得推荐 例如loaders http developer android com reference android content Loader html 问题 As
  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • ImageView Android 内存

    我原来的后续question https stackoverflow com questions 5339883 android app ram usage 有没有一种方法可以在 Android 应用程序中使用 ImageViews 而不使
  • 强制关闭导致HTTP实体可能不为空

    这里是发送数据 Http 的完整代码 asynctask private class MyAsyncTaskPupuk extends AsyncTask
  • Android物理引擎[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在研究了 3D 游戏编程之后 很快就明白了为什么物理引擎非常有用 Android 支持哪些物理引擎并且可以在 Android 上使用 关于
  • 获取包含位图支持的画布的 Android 视图上的点的像素颜色值

    我正在尝试找出获取给定点上像素颜色值的最佳方法View http developer android com reference android view View html 我可以通过三种方式写入视图 我设置了背景图像View setBa
  • 带有内容提供商的小部件;无法使用ReadPermission?

    所以我刚刚为我的应用程序实现了一个小部件 它通过我的数据库从数据库获取数据ContentProvider 我在清单中定义了自己的读 写权限 声明我使用它们 似乎没有什么区别 并在内容提供程序中要求它们
  • 具有多个字符串的列表视图

    我正在尝试创建一个包含多个字符串的列表视图 现在我有一个可以实现的功能 while i lt 10 GETS DATA FROM WEBPAGE ETC a DATAFROMWEBPAGE1 b DATAFROMWEBPAGE2 c DAT
  • 错误:类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

    我已尝试一切方法来消除此错误 但它不断出现 Class kotlin reflect jvm internal FunctionCaller FieldSetter can not access a member of class com
  • 如何从Android webview下载文件?

    我下面的代码可以很好地加载 url 页面 并且在搜索歌曲后 当我单击下载链接时 它崩溃了 关于如何让下载管理器与网络视图一起工作的教程并不多 我究竟做错了什么 import java io File import android app A
  • 无法在 Android Studio 中运行项目

    当我尝试在 Android Studio 中运行我的项目时 我收到以下错误消息 Execution failed for task CricHQ dexDebug gt com android ide common internal Log
  • 特定铃声 firebase 通知 xamarin.android

    How i can force the push notification to run ringtone instead of default notification sound is there any way to ovveride
  • 测试应用内结算:“发布者无法购买此商品”

    我的应用程序似乎已准备好在我的设备上进行应用内购买程序的 现实生活 测试 但是 我在 Play 商店中收到 发布商无法购买此商品 的错误消息 现在 我应该如何测试这个 我不想通过仅用于测试的虚拟帐户重新安装手机来丢失手机的配置 在开发者控制
  • 如何在 Android 的应用程序中使用 LDAP 身份验证?

    我想在我们的应用程序中添加 LDAP 身份验证 我在 Github 上搜索并找到了两个应用程序 但它们无法连接到服务器 通过ldap连接服务器的必要条件是什么 查看 UnboundID SDK 他们有一个适用于 Android 的套件 该应
  • 活动构建变体没有测试工件

    我基于 调试 构建变体创建了一个名为 bitrise 的新构建类型 使用 debug 构建变体时 经过检测的 androidTests 构建并运行良好 但是当我切换到新的 bitrise 构建变体时 出现以下错误 Process finis
  • 在android中测量不规则多边形的面积

    我正在开发一个应用程序 在其中我在地图上绘制多边形 并且我使用的地图不是谷歌 它的Mapsforge开源离线地图库 我可以通过将地理点转换为像素点来轻松在地图上绘制多边形 但在这里我想发现是不规则的多边形 为此我做了很多尝试 但它让我失败了
  • Android 中用于过渡的自定义动画对象?

    我想用一些更奇特的东西来覆盖 Android 中的默认活动转换 我想做的事情不能用通常使用的 XML 集来完成 所以我不能使用overridePendingTransition因为它只接受对基于 XML 的动画资源的整数引用 我想做的是创建
  • 带有包含布局的导航抽屉布局

    我认为我的问题实际上很简单 但我不知道如何解决 有一个工作导航抽屉 代码如下

随机推荐

  • 在 JOptionPane 上设置 DocumentFilter

    我在用着 String s JOptionPane showInputDialog 从用户那里得到对问题的答复 该对话框设置为显示响应的文本字段 我想将响应中允许的字符限制为仅字母数字和 是否可以在文本字段上安装 DocumentFilte
  • javascript 文件附加非法字符

    我认为我的 apache 网络服务器有问题 我无法参考jquery js 我收到以下错误 带镀铬 Uncaught SyntaxError Unexpected token ILLEGAL 使用火狐浏览器 Error illegal cha
  • docker重启时数据库丢失

    我在 Windows 10 的 Docker 上运行 influxdb 和 grafana 每次关闭 Docker 时 我都会丢失数据库 这是我所知道的 我尝试过调整保留策略 但对 结果 我可以关闭并重新启动容器 docker compos
  • Spotfire 交叉表中的总计问题

    当我使用FIRST CG1 在 单元格值 中 总计不是求和而是显示结果中的值之一FIRST CG1 请告知我们是否必须始终使用sum XXX 得到总计 简短的回答 是的 如果你想要的话Grand Total是您的数据的总和 将总计应用于不同
  • 如何在 Perl 中压缩多个文件?

    如何 tar 多个目录并附加具有某种模式 如 txt 的文件 并排除某些目录并将某些模式 如 exe 全部排除到单个 tar 文件中 要点是目录数量未知 动态 所以我猜我需要循环遍历 I d use 存档 焦油 http search cp
  • 如何在 Grails 中的控制器中声明 inList 约束?

    谁能告诉我如何声明inListGrails 控制器中的约束 假设我有这门课 class A List hello 我怎样才能添加inList的约束条件为hello List从控制器内部 定义一个约束 其中List属性是否具有针对列表列表进行
  • d3.js 家庭树配偶亮点

    代码链接 http jsfiddle net mj58659094 yKUsQ http jsfiddle net mj58659094 yKUsQ 当单击一个人 节点 时 它也会选择配偶 我只想选择 突出显示 我点击的人 丈夫或妻子或孩子
  • 将 SQL 源文件与 bigquery cli 结合使用

    是否可以在 bigquery CLI 中使用输入文件 bq query lt my query sql 如果您使用的是 unix 或者在 windows 上安装了 cygwin 则可以使用 xargs xargs a my query sq
  • Delphi HelpInsight 以及实施中的总结

    我正在寻找有关带有摘要标签的 Help Insight 的解决方案 帮助 我正在使用 Delphi Tokyo 10 2 Update 2 1 HelpInsight 可以工作并且该函数确实有附加信息 interface type TMyC
  • setTimeout 在 forEach 中不起作用

    我有一个调用函数的 forEach 每次调用之间需要有一个延迟 我已将其放在 forEach 内的 setTimeout 内 它不尊重第一次等待后的超时 相反 它等待一次 然后立即运行 我已将超时设置为 5 秒 并使用控制台进行确认 等待
  • 使用哈希字典的词形还原函数不适用于 R 中的 tm 包

    我想使用大型外部词典 格式如下面的 txt 变量所示 对波兰语文本进行词形还原 我并不幸运 无法使用流行的文本挖掘包来选择波兰语 答案https stackoverflow com a 45790325 3480717 https stac
  • 使用代码接收在动态选择中选择一个选项?

  • Sling Servlet 中的 CQ5 QueryBuilder 参考

    我像这样声明一个 sling servlet Component metatype false Service Servlet class Properties Property name sling servlet paths value
  • Flash CS6 项目面板错误错误#2032:流错误

    卸载 CS5 5 并安装 CS6 后 我的项目选项卡损坏了 这是它显示的内容 Error 2032 Stream Error URL file C Users Eric AppData Local Adobe Flash CS6 en US
  • 使用 Google 地图 API 的地图和移动标记

    我必须写一个演示 这应该像航班内移动地图并需要绘制相同的曲线Polyline between two geo points locations正如你所看到的下图 Even I would not mind switching到其他一些 SD
  • CSS 溢出的属性

    我有两个与 CSS 溢出属性相关的问题或者更确切地说需要澄清 据说 具有非可见溢出值的框将垂直扩展 包围任何浮动的后代盒子 另外关于利润率 据说 对于具有溢出值的盒子 边距永远不会崩溃 比可见的 您能否用相同的实际用途解释这两点 如果您可以
  • mysqli_poll() - 第三个参数有什么用?

    在没有任何文件的情况下超越函数原型 http php net manual en mysqli poll php我正在努力寻找 mysqli poll 函数的第三个参数是什么 int mysqli poll array read array
  • Makefile 只能在发生错误时才执行代码吗?

    在我的 Makefile 中 我有一些检查网络连接的代码 该代码需要相当多的时间来运行 我只想在另一个目标无法构建时运行它 当前的生成文件 all files network compile files files get files fr
  • XCUITest - 如何在应用程序运行时禁用 Wi-Fi?

    我想在运行 XCUITest 时自动化 ios 应用程序的行为 手动执行测试时 我关闭了无线适配器 如何使用 Xcode UI 测试来做到这一点 thanks 附注我发现我们可以使用下面的命令来禁用 wi fi 但要做到这一点 我需要将我的
  • Android 同时使用 getFragmentManager 和 getSupportFragmentManager 会导致重叠

    我的活动中有这样的内容 Override public void onNavigationDrawerItemSelected int position Fragment fragment null switch position 1 ca