gpt4 book ai didi

android - ViewPager 具有不同的纵向和横向适配器

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:54:54 27 4
gpt4 key购买 nike

在纵向模式下,我的 ViewPager有 3 个 fragment A、B、C,但在横向模式下,它只有 2 个 fragment A 和 C。所以我创建 2 FragmentStatePagerAdapter s 代表每种模式。问题是当屏幕方向改变时,ViewPager恢复并使用旧方向的先前 fragment 。例如,当将方向从纵向更改为横向时,ViewPager现在显示 2 个 fragment A、B 而不是 A 和 C。我知道为什么会这样,但找不到好的解决方案。

我目前的解决方法是为 ViewPager 使用不同的 ID (例如:纵向布局的 id/viewpager_portrait 和横向布局的 id/viewpager_landscape)以防止重复使用 fragment ,但这会导致内存泄漏,因为旧 fragment 不会被破坏并且仍保留在内存中。

我尝试了一些解决方法,例如在 Activity 的 onCreate 中调用 super.onCreate(null) ,或删除 ViewPager 的 fragment 在 Activity 的 onSaveInstanceState但它们都会让我的应用程序崩溃。

所以我的问题是如何避免重复使用 FragmentStatePagerAdapter 中的一个或多个 fragment 方向何时改变?

任何帮助将不胜感激。提前致谢。

最佳答案

问题可能是 Android 提供的 Fragment 的内置 PagerAdapter 实现假定项目将保持不变,因此保留和重用基于索引的对添加到 ViewPager 的所有 Fragment 的引用。这些引用通过 FragmentManager 维护,即使在 Activity(和 Fragment)由于配置更改或进程被终止而重新创建之后也是如此。

您需要做的是编写您自己的 PagerAdapter 实现,将自定义标签与每个 Fragment 相关联并存储 Fragment以基于标签(而不是基于索引)的格式。在添加一个抽象方法以提供基于索引的标签后,您可以从现有方法之一派生出此方法的通用实现。当然,您必须从 ViewPager 中删除在先前配置中添加的孤立/未使用的 Fragment(理想情况下保持其状态)。

如果您不想自己实现整个解决方案,那么可以使用 CWAC-Pager 中的 ArrayPagerAdapter库可用于提供合理的实现,而无需付出太多努力。初始化后,您可以根据提供的标记分离相关的 Fragment,并根据需要从适配器中删除/添加它。

关于android - ViewPager 具有不同的纵向和横向适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23149850/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com