【问题标题】:SherlockFragmentActivity not restoring fragments correctly when working with ViewPager使用 ViewPager 时 SherlockFragmentActivity 无法正确恢复片段
【发布时间】:2013-07-21 18:32:50
【问题描述】:

我使用 ActionBarSherlock 和 ViewPager 将 4 个片段作为 SherlockFragmentActivity 中的标签页。

在正常情况下,此解决方案运行良好。

但是,如果应用程序异常退出,即由于内存不足而被 Android 操作系统杀死,则 ViewPager 在导航回 SherlockFragmentActivity 时无法再将新创建的 Fragment 附加到 Activity。

经过大量调试,我终于发现 SherlockFragmentActivity “记住”了附加到它的片段。当它被重新创建时,它会重新创建片段并将其附加到自身,这会阻止 ViewPager 将任何新片段附加到 Activity。

我通过使用空实现覆盖 SherlockFragmentActivity#onSaveInstanceState 来解决此问题,以强制 SherlockFragmentActivity 忘记所有片段。但是我还没有完美的解决方案。

我怀疑这是 SherlockFragmentActivity 的缺陷。

综上所述,我认为SherlockFragmentActivity在使用ViewPager时存在恢复内部碎片的缺陷。

有人遇到过同样的问题吗?

【问题讨论】:

  • 如果您假设存在错误,那么您应该能够发布复制该行为的示例。
  • 您使用的是什么版本的 ABS?
  • 您从哪种视图寻呼机适配器扩展而来?
  • 我使用的是 ActionbarSherlock 4.3。我的 ViewPager 是 android.support.v4.view.ViewPager。我的寻呼机适配器扩展自 android.support.v4.app.FragmentPagerAdapter。在向ActionBarSherlock的作者报告之前,我会准备一个样本进行双重确认。

标签: android actionbarsherlock android-viewpager fragment


【解决方案1】:

根据您所说的,我看不到这里有错误的证据。您的解决方案是一个很好的解决方案,它被广泛使用。

但我确实想质疑您的分析。如果片段是静态的 (XML),那么 Android 将自动重新创建它们。但是,如果您是动态创建片段(我假设您使用的是选项卡),那么 Android 系统不会在 Activity 销毁后自动重新创建它们。在这种情况下,您应该使用 onSaveInstanceState 以编程方式恢复片段/选项卡。

虽然您没有提到配置更改的问题,但如果您使用的是 ABS,您不应该尝试在您的应用中处理配置更改。这是我在使用 ABS 时遇到的与“标准”的唯一偏差。

如果您在这里寻找高质量的响应,那么我建议您发布代码和 logcat 跟踪。

【讨论】:

  • 在向ActionBarSherlock作者报告之前,我会准备一个样本进行双重确认
【解决方案2】:

我遇到过类似的问题。解决方案对我有用:

  1. 首先,使用默认构造函数重新创建片段。因此,如果您将自定义构造函数中的一些参数传递给片段,您应该在 onSaveInstanceState 期间保存它们并在 onCreateView() 中取出它们。

    如果整个应用程序没有被操作系统杀死,它将保存您的片段。

  2. 要在整个应用重新创建后恢复片段,请使用 SharedPrefs 保存重要数据。 在 onStop() 方法中执行此操作并在 onCreateView() 中恢复的好地方。

如果您需要代码示例,请告诉我,但这对您来说似乎不是问题。

【讨论】:

  • 谢谢,在向ActionBarSherlock的作者报告之前,我会准备一个样本进行双重确认。我会邀请你检查我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
相关资源
最近更新 更多