问题标签 [fragmentstateadapter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
51 浏览

android - Fragment instances are kept in viewPager2 when host fragment removed

Have one activity app, where I have HomeFragment from which I open HostFragment, and HostFragment has ViewPager2 with 3 fragment items TabFragment1, TabFragment2 and TabFragment3.

When I open the HostFragment, and then go back, my tabFragments' instances are not removed. Below is the logs from lifecycles

navController.navigate(directionToHostFragment)

  1. HostFragment OnStart HostFragment{c37542c}
  2. TabFragment1 OnStart TabFragment1 {f41b08}

navController.popBackStack()

  1. HostFragment OnPause HostFragment{c37542c}
  2. HostFragment OnStop{c37542c}
  3. HostFragment OnDestroy {c37542c}

navController.navigate(directionToHostFragment) Blockquote

  1. HostFragment OnStart{2670c03}
  2. TabFragment1 OnStart{f45b87d}

navController.popBackStack()

  1. HostFragment OnPause{2670c03}
  2. HostFragment OnStop{2670c03}
  3. HostFragment onDestroy{2670c03}

From ids you can see that there is a new TabFragment1 instance and old one haven't destroyed(I have logs in onPause(), onStop() etc.).

Some code snippets: Adapter for viewPager2 I used -

Some part from TabFragment1

So any hints how to deal with this problem?

0 投票
1 回答
289 浏览

android - FragmentStateAdapter 和 ViewPager2 加载片段的速度比 FragmentStatePagerAdapter 和 ViewPager 慢

在我的应用程序中,我显示了可以滚动到上个月和下个月的月历列表。在滑动到上一个和下一个时,如果我使用 FragmentStatePagerAdapter 和 ViewPager,我的片段可以顺利加载并且没有任何延迟,但它现在已被弃用。所以,我更新了

ViewPager 到 ViewPager2 

FragmentStatePagerAdapter 到 FragmentStateAdapter 

更新后,我可以看到在上下滑动时加载片段有延迟。但是相同的代码可以顺利地与 FragmentStatePagerAdapter 和 ViewPager 一起使用。我也试过mViewPager2.setOffscreenPageLimit(//Interger Value//)但没有帮助。

请帮助我。

使用 FragmentStateAdapter 和 ViewPager2 使用 FragmentStatePagerAdapter 和 ViewPager

fragment_employee_months_holder

EmployeeSummaryAdapter

EmployeeSummaryFragmentHolder

EmployeeSummaryFragment

0 投票
1 回答
98 浏览

android - 如何替换 FragmentStateAdapter 中的片段

我有一个“主”片段,其中包含侧面的选项卡,当我单击任何这些选项卡时,“主”片段的 ViewPager2 会跳转到 FragmentStateAdapter 中的特定片段(每个片段属于不同的类)。

假设对于其中一个片段,它有一个按钮,如果按下该按钮,它将替换 FragmentStateAdapter 中的当前片段,但选项卡仍在旁边(我们仍在“主”片段中)。如果我点击在任何选项卡上,我希望它像以前一样在特定片段中工作。

我想这样做,但我不确定该怎么做,或者它是否是正确的方法。我应该替换 FragmentStateAdapter 中的一个片段,还是应该完全销毁 ViewPager2 并用所需的片段替换它?还是有更好的方法?

这就是 FragmentStateAdapter 的样子,我想在单击其中的按钮时用不同的片段替换 EscortFragment。

0 投票
1 回答
24 浏览

android - 如何在bottomSheet关闭后更新fragmentStateAdapter

我有这个fragmentStateAdapter,它保存了我的一些卡片以便在它们之间滑动:

CardItemFragment

然后我可以像这样更新fragmentStateAdapter中的卡片

这很好,我可以在我的卡片之间滑动,但是当我通过底部表更改卡片的“名称”属性的值时,当我关闭BottomSheet时,我使用此代码刷新fragmentSatateAdapter

我将MyActivity设置为伴随对象,以便在任何地方访问它。

执行此代码时,我得到的片段不是 null 对象,但updateCard给了我 null 对象 1 问题是什么,我该如何克服这个问题并更新显示的Card

0 投票
0 回答
72 浏览

android - Fragment 中的 ViewPager2 不显示 Fragments

我在片段中设置 ViewPager2 时遇到问题。据我所知,我所做的一切都是正确的,但是我想在托管片段中显示的片段根本不显示。这是我的适配器:

我在如下所示的方法中设置了 ViewPager2 onViewCreated()

我尝试过的事情包括:

  • 将适配器更改FragmentManagersupportFragmentMangerparentFragmentManager

  • 更改FragmentStateAdaperto的构造函数参数FragmentActivity并在宿主 Fragment 中创建实例requireActivity()

  • 提供我想在托管片段中显示的片段的实例

  • 记录fragments[position]何时createFragment()调用的结果。这证实了createFragment单击选项卡时正在调用

带有选项卡的主机 Fragment 的图片不显示子 Fragments(REPS FRAGMENT 是主机布局)

0 投票
0 回答
80 浏览

android - FragmentStateAdapter 崩溃应用程序构建幻灯片

我的 Android 应用程序的载入是使用 FragmentStateAdapter 构建的,这是用户在安装应用程序后看到的第一个视图,即幻灯片列表。在某些用户上,应用程序在尝试显示第一张幻灯片时崩溃,因为幻灯片列表仍然是空的。我查看了代码,但找不到问题所在,所以我想与您分享:

这是我的 SlideViewerFragment 的摘录,我的应用程序中显示的第一个片段:

这是我的幻灯片适配器:

这是我的 SlideFragmentFactory:

这是我的幻灯片片段:

最后,这是我的 SlideViewModel:

如您所见,我添加了一些 Crashlytics 日志。好吧,应用程序在 SlideViewModel:getSlideData 中崩溃,行“return slides.get(index)”,因为 slides 为空。

Crashlytics 日志显示:

在此之后,崩溃:

我不知道为什么会出现这些日志,但 SlideAdapter:buildFragmentAtIndex 中的日志没有出现......

知道我在这里想念什么吗?

编辑:

在重新阅读了我的问题、日志并受到 Ramesh 评论的启发后,我认为问题在于(我不知道为什么)我的 SlideFragment 是在 FragmentStateAdapter 之前构建的,所以我重构了部分代码以更改施工流程。

现在,我的 SlideAdapter 在构造函数中获取幻灯片列表:

SlideViewerFragment 也发生了变化,只有在我准备好幻灯片列表时才构建适配器:

我很确定这会修复错误,但不幸的是,我仍然遇到同样的崩溃,日志完全相同。这怎么可能在 SlideAdapter 的日志之前调用 SlideFramgent 的日志?

0 投票
0 回答
410 浏览

android - 如何刷新/重新加载具有 viewpager2 和 FragmentStateAdapter(fragmentActivity) 的片段

我正在构建一个具有 3 个片段的应用程序条码/rfid 应用程序。我想从 FragmentA 重新加载 FragmentB。每当用户扫描条形码并将其添加到 FragmentA 中的 sqlite db 时,它应该刷新 FragmentB 中的列表。片段 B 使用 sqlite db 显示所有条形码。此时,Fragment B 只显示它在创建 Fragment 时最初从 sqlite 查询的列表。我想在单击片段时刷新片段,或者在单击片段 A 中的添加时重新加载片段 B。我对片段不太了解,希望能详细说明。我正在使用 viewpager2 和 FragmentStateAdapter(fragmentActivity)。我在网上搜索过,只找到与 FragmentStateAdapter(FragmentManager) 相关的答案,而与 FragmentStateAdapter(fragmentActivity) 无关。

ShippingViewPagerAdapter2

运送菜单

ShippingMainFragment(FragmentA)

ShippingScannedFragment(FragmentB)

0 投票
1 回答
54 浏览

android - findFragmentByTag 使用 ViewPager 在 Android 中不断返回 Null

我试图将数据从 Parent Activity 传递给viewPager,我找到了一个使用findFragmentByTag但它返回 Null 的解决方案,我不确定我错过了什么。

我发现的示例使用了已弃用的示例FragmentPagerAdapter,我想这可能就是我的实现不起作用的原因,所以我正在寻找前进的道路。

一片空白

主要活动

页面适配器

0 投票
1 回答
138 浏览

android - Dagger-Android:片段销毁时 ViewModel 未销毁

在我的项目中,我使用 Dagger2 将 ViewModels 注入片段中。

为了简要解释我的情况,我有一个使用片段状态适配器的片段,其中包含两个片段。为了方便起见,我将在片段状态适配器片段 B 和片段 C 中调用父片段片段 A 和子片段。

通常,在测试应用程序时,用户会花时间在包含 recyclerview 的片段 B 中。当用户点击其中一个项目时,它会导致一个带有一些详细信息的不同片段。当用户输入该详细信息片段时,持有该项目的片段 B 将通过 onPause() 和 onStop()。同时,在片段 C 中调用了 onStop()。

关键是,如果用户在片段 B(由片段 A 包含)中花费了足够的时间,片段 C 将被销毁,这并不奇怪,因为我知道这是片段状态适配器的意图。它应该在不可见时摆脱一些碎片。

我的问题是,当片段 C 被破坏时,与之关联的视图模型不会被破坏。这很糟糕,因为现在当用户转到仍然引用旧视图模型的片段 C 时,应用程序不会向片段提供任何数据,因为当调用 onDestroy() 时,片段 C 的视图模型被清除,因此 viewmodelscope.launch 是不工作。

我也想过不使用 viewmodelscope (使用 coroutinescope 代替),但这不是问题。我很好奇和渴望知道为什么片段C的视图模型,范围为片段C的生命周期没有被破坏。(我想在片段C消亡时摆脱旧的视图模型并获得新的视图模型实例)

请理解我笨拙的措辞和我缺乏知识可能会引起一些混乱。我是匕首新手。请参阅下面的代码以更好地理解。

应用组件.kt

ViewModelModule.kt

视图模型工厂

分段

适配器

子组件

适配器模块

我发现当片段 C 被销毁并再次创建时,没有调用 ViewModelFactory 的 create 方法。我认为这是因为我正在使用 viewmodel 的延迟初始化,这就是 ViewModelLazy 的工作方式。它缓存视图模型并仅在缓存为空时调用工厂的创建方法。我猜发生的事情是片段 C 的旧视图模型仍在引用死视图模型(它在 viewModelStore.onclear 中幸存下来)。我在片段 C 的视图模型的 init 块中放置了一条日志语句,我可以看到它仅在片段 C 被创建的第一次被调用,并且即使片段 C 被销毁并再次创建,也不再被调用。

非常感谢您耐心阅读所有这些哈哈。因此,我需要任何有经验的 Android 专家的帮助,他们可能能够提供一些见解。

我的目标:使用片段的生命周期销毁和重新创建视图模型。我想避免由于未使用的僵尸视图模型而导致内存泄漏。

当前情况:视图模型永远不会被销毁,重生的片段仍然引用旧的视图模型,因此延迟初始化会保留旧视图模型的缓存,而不是触发 ViewModelFactory 的创建方法。

- 编辑 -

使用“com.google.dagger:dagger-android:2.37”的匕首版本

0 投票
1 回答
43 浏览

android - 由于 ViewPager2 导致 TabLayout 损坏

我有一个Tablayout带有 2 个选项卡(片段)的主页和联系人,使用ViewPager2. 每个片段中的数据(在每个onResume()TabLayout Activity 上都请求更新)。由于我必须调用adapter.notifyItemChanged(position);以刷新片段,因此我必须按照本getItemId蓝色注释中的说明覆盖两者和containsItem我的数据。FragmentStateAdpater

问题是现在 TabLayout 坏了,如果我切换选项卡,那么在前一个选项卡中膨胀的菜单仍然存在(例如,从联系人切换时搜索菜单项仍然存在)并且通过打印一些日志,我注意到它进入了一个循环. 如果不覆盖getItemId并且containsItemtablayout 可以正常工作,但更新时不会刷新数据。

也许获取片段的哈希不是唯一的 ID,因为片段是使用 object ( BusinessCard.newInstance(myContact);) 创建的,第二个是 list ContactList.newInstance(listContacts);

任何帮助都会非常有用,因为我完全迷路了。

非常感谢!

编辑:

如果我切换到联系人选项卡它开始循环。日志:

在图片中,您可以将问题可视化。在 Home 片段中,不应出现搜索项菜单。从联系人切换回主页后,它仍然存在: 断开的选项卡布局