问题标签 [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.
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)
- HostFragment OnStart HostFragment{c37542c}
- TabFragment1 OnStart TabFragment1 {f41b08}
navController.popBackStack()
- HostFragment OnPause HostFragment{c37542c}
- HostFragment OnStop{c37542c}
- HostFragment OnDestroy {c37542c}
navController.navigate(directionToHostFragment) Blockquote
- HostFragment OnStart{2670c03}
- TabFragment1 OnStart{f45b87d}
navController.popBackStack()
- HostFragment OnPause{2670c03}
- HostFragment OnStop{2670c03}
- 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?
android - FragmentStateAdapter 和 ViewPager2 加载片段的速度比 FragmentStatePagerAdapter 和 ViewPager 慢
在我的应用程序中,我显示了可以滚动到上个月和下个月的月历列表。在滑动到上一个和下一个时,如果我使用 FragmentStatePagerAdapter 和 ViewPager,我的片段可以顺利加载并且没有任何延迟,但它现在已被弃用。所以,我更新了
ViewPager 到 ViewPager2
FragmentStatePagerAdapter 到 FragmentStateAdapter
更新后,我可以看到在上下滑动时加载片段有延迟。但是相同的代码可以顺利地与 FragmentStatePagerAdapter 和 ViewPager 一起使用。我也试过mViewPager2.setOffscreenPageLimit(//Interger Value//)
但没有帮助。
请帮助我。
fragment_employee_months_holder
EmployeeSummaryAdapter
EmployeeSummaryFragmentHolder
EmployeeSummaryFragment
android - 如何替换 FragmentStateAdapter 中的片段
我有一个“主”片段,其中包含侧面的选项卡,当我单击任何这些选项卡时,“主”片段的 ViewPager2 会跳转到 FragmentStateAdapter 中的特定片段(每个片段属于不同的类)。
假设对于其中一个片段,它有一个按钮,如果按下该按钮,它将替换 FragmentStateAdapter 中的当前片段,但选项卡仍在旁边(我们仍在“主”片段中)。如果我点击在任何选项卡上,我希望它像以前一样在特定片段中工作。
我想这样做,但我不确定该怎么做,或者它是否是正确的方法。我应该替换 FragmentStateAdapter 中的一个片段,还是应该完全销毁 ViewPager2 并用所需的片段替换它?还是有更好的方法?
这就是 FragmentStateAdapter 的样子,我想在单击其中的按钮时用不同的片段替换 EscortFragment。
android - 如何在bottomSheet关闭后更新fragmentStateAdapter
我有这个fragmentStateAdapter,它保存了我的一些卡片以便在它们之间滑动:
CardItemFragment是:
然后我可以像这样更新fragmentStateAdapter中的卡片:
这很好,我可以在我的卡片之间滑动,但是当我通过底部表更改卡片的“名称”属性的值时,当我关闭BottomSheet时,我使用此代码刷新fragmentSatateAdapter:
我将MyActivity设置为伴随对象,以便在任何地方访问它。
执行此代码时,我得到的片段不是 null 对象,但updateCard给了我 null 对象 1 问题是什么,我该如何克服这个问题并更新显示的Card?
android - Fragment 中的 ViewPager2 不显示 Fragments
我在片段中设置 ViewPager2 时遇到问题。据我所知,我所做的一切都是正确的,但是我想在托管片段中显示的片段根本不显示。这是我的适配器:
我在如下所示的方法中设置了 ViewPager2 onViewCreated()
:
我尝试过的事情包括:
将适配器更改
FragmentManager
为supportFragmentManger
和parentFragmentManager
更改
FragmentStateAdaper
to的构造函数参数FragmentActivity
并在宿主 Fragment 中创建实例requireActivity()
提供我想在托管片段中显示的片段的实例
记录
fragments[position]
何时createFragment()
调用的结果。这证实了createFragment
单击选项卡时正在调用
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 的日志?
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)
android - findFragmentByTag 使用 ViewPager 在 Android 中不断返回 Null
我试图将数据从 Parent Activity 传递给viewPager
,我找到了一个使用findFragmentByTag
但它返回 Null 的解决方案,我不确定我错过了什么。
我发现的示例使用了已弃用的示例FragmentPagerAdapter
,我想这可能就是我的实现不起作用的原因,所以我正在寻找前进的道路。
一片空白
主要活动
页面适配器
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”的匕首版本
android - 由于 ViewPager2 导致 TabLayout 损坏
我有一个Tablayout
带有 2 个选项卡(片段)的主页和联系人,使用ViewPager2
. 每个片段中的数据(在每个onResume()
TabLayout Activity 上都请求更新)。由于我必须调用adapter.notifyItemChanged(position);
以刷新片段,因此我必须按照本节getItemId
蓝色注释中的说明覆盖两者和containsItem
我的数据。FragmentStateAdpater
问题是现在 TabLayout 坏了,如果我切换选项卡,那么在前一个选项卡中膨胀的菜单仍然存在(例如,从联系人切换时搜索菜单项仍然存在)并且通过打印一些日志,我注意到它进入了一个循环. 如果不覆盖getItemId
并且containsItem
tablayout 可以正常工作,但更新时不会刷新数据。
也许获取片段的哈希不是唯一的 ID,因为片段是使用 object ( BusinessCard.newInstance(myContact);
) 创建的,第二个是 list ContactList.newInstance(listContacts);
。
任何帮助都会非常有用,因为我完全迷路了。
非常感谢!
编辑:
如果我切换到联系人选项卡它开始循环。日志: