使用 NavGraph 从另一个 Fragment 切换回来时,包含 ViewPager 的 Fragment 会重新加载 - Jetpack Navigation

2024-02-27

(下面提供了 TLDR)

我有一个复杂的活动片段结构,之前是 3 个活动,现在转换为三个片段。因为它复杂、繁重并且需要交换大量数据,所以我将其更改为基于新的导航 UI 的结构,查看 Google 的向日葵,它现在更干净,工作速度更快更好。

My app's flow can easily be understood by the image provided below (Nav Graph provided below): Image describing my app's flow

主要片段是Fragment1其中包含ViewPager2 with FragmentStateAdapter和里面的 5 个碎片。问题是Fragment1当用户返回时完全重新加载Fragment2.

两种可能的情况:

  1. 当用户打开时Fragment2 from Fragment1然后回来,Fragment1其中包含ViewPager完全重新加载需要 2-3 秒,因为它包含 5Fragment其中进一步包括Fragment这就是我需要解决的问题。

  2. 正如我正在使用的ViewBinding,如果我检查绑定是否已初始化(下面的代码)并传递初始化,则 Fragment1 不会重新加载but里面的碎片ViewPager遇到任何 Fragment 中的任何按钮都会停止工作之类的问题,TabLayout将停止工作,孩子ViewPager2s in FragmentB, FragmentD and FragmentE将停止工作。

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        if (!this::binding.isInitialized) {
            //initializing Binding here
        }
        return binding.root
    }
    

  1. Graph nav_main.xml with pictorial representation: enter image description here

     <navigation xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         xmlns:tools="http://schemas.android.com/tools"
         android:id="@+id/nav_main"
         app:startDestination="@id/fragment_1">
    
         <fragment
             android:id="@+id/fragment_1"
             android:name="com.x.x.fragments.Fragment1"
             tools:layout="@layout/fragment_1">
    
             <action
                 android:id="@+id/action_fragment_1_to_fragment_2"
                 app:destination="@id/fragment_2"
                 app:enterAnim="@anim/slide_in_right"
                 app:exitAnim="@anim/slide_out_left"
                 app:popEnterAnim="@anim/slide_in_left"
                 app:popExitAnim="@anim/slide_out_right" />
             <action
                 android:id="@+id/action_fragment_1_to_fragment_3"
                 app:destination="@id/fragment_3"
                 app:enterAnim="@anim/slide_in_right"
                 app:exitAnim="@anim/slide_out_left"
                 app:popEnterAnim="@anim/slide_in_left"
                 app:popExitAnim="@anim/slide_out_right" />
    
         </fragment>
    
         <fragment
             android:id="@+id/fragment_2"
             android:name="com.x.x.fragments.Fragment2"
             tools:layout="@layout/fragment_2">
    
             <action
                 android:id="@+id/action_fragment_2_to_fragment_3"
                 app:destination="@id/fragment_3"
                 app:enterAnim="@anim/slide_in_right"
                 app:exitAnim="@anim/slide_out_left"
                 app:popEnterAnim="@anim/slide_in_left"
                 app:popExitAnim="@anim/slide_out_right" />
    
             <argument
                 android:name="DataModel"
                 app:argType="com.x.x.models.DataModel" />
    
             <argument
                 android:name="Tab"
                 app:argType="integer" />
    
         </fragment>
    
         <fragment
             android:id="@+id/fragment_3"
             android:name="com.x.x.fragments.Fragment3"
             tools:layout="@layout/fragment_3">
    
             <argument
                 android:name="DataModel"
                 app:argType="com.x.x.models.DataModel" />
    
         </fragment>
    
     </navigation>
    
  2. 活动_main.xml

     <layout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto">
    
         <androidx.fragment.app.FragmentContainerView
             android:id="@+id/nav_host"
             android:name="androidx.navigation.fragment.NavHostFragment"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             app:defaultNavHost="true"
             app:navGraph="@navigation/nav_main" />
    
     </layout>
    

(TL;DR)所以,我的问题是如何防止重新加载FragmentA其中包含ViewPager2并确保里面的Fragment不会停止工作?如果我只能阻止儿童重新加载,我没有问题FragmentC,应用程序打开的默认值,其他应用程序可以重新加载。请注意,我已经阅读了几乎所有(有些)类似的问题和答案,但没有一个有帮助。

EDIT- 我尝试了两个答案这个问题 https://stackoverflow.com/q/47108494/8244632我想以此获得成功,但没有任何效果。

EDIT2- 发现一个类似的热门问题,没有任何可行的解决方案 -带有片段和 Jetpack 导航的 Viewpager2:恢复片段而不是重新创建它们 https://stackoverflow.com/q/57271553/8244632.

EDIT3- 我也尝试保存实例ViewPager的适配器使用saveState() in onStop() and onSaveInstanceState()并使用恢复它restoreState()但随后,它只显示白屏。

EDIT4- 我也搜索了他们的 Github 问题,但没有找到解决方案。我唯一的解决方案是返回“活动”吗?难道和这些Fragment没有任何关系吗?


None

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

使用 NavGraph 从另一个 Fragment 切换回来时,包含 ViewPager 的 Fragment 会重新加载 - Jetpack Navigation 的相关文章

  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • 如何使用导航组件在单一活动设计中使用偏好?

    我想使用导航组件迁移到单一活动设计 我正在使用一项活动 其他活动是片段 对于某些屏幕 我只有布局 没有偏好 使碎片膨胀没有问题 但当我尝试按偏好工作时 我遇到了问题 我的要求是 我需要在片段中膨胀工具栏和首选项列表 我的做法 使用以下代码添
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 将现有 VARCHAR 列与 Room 结合使用

    我正在尝试将现有的数据库与 Android Room 一起使用 但是 我的一个表有一个 VARCHAR 列 Room 似乎只支持 TEXT 不支持 VARCHAR 而且 sqlite 不允许修改列类型 那么 有没有办法使用Room中现有的带
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所

随机推荐