【问题标题】:Handling runtime Orientation Changes in android处理android中的运行时方向变化
【发布时间】:2014-11-04 22:47:38
【问题描述】:

在我的应用程序中,我有活动 A。单击此 Activity 上的按钮后,应用程序启动 Activity B。在 Activity B 的 onCreate() 内部,我添加了一个片段。每次创建片段时,它都会使用 AsyncTask 从外部服务器加载一个列表。

如何在配置更改上保留此列表?我已经寻找了许多解决方案,但许多人建议在清单中使用“android:configchanges”,我完全反对使用。许多人建议并且我也读过它 - 使用 setRetainInstance (true) 在 Fragment 中将保留该片段。

我尝试实现它,但失败了。方向更改后的许多教程使用 findFragmentByTag 检查片段,但在我的情况下它总是返回 null。任何人都可以发布有关如何使用 RetainFragments 的正确教程或正确答案吗?

另外,我正在调用 AsyncTask 以在 Fragment 的 onActivityCreated 方法中加载列表。根据 android 文档,使用 setRetainInstance(true) 时,不会调用 onCreate(Bundle),因为没有重新创建片段。 onAttach(Activity) 和 onActivityCreated(Bundle) 仍然会被调用。

那么我应该在 onCreate 方法中调用 AsyncTask 吗?

【问题讨论】:

  • 看看 AsyncTaskLoader。这些正是针对您提到的这种情况而制作的。
  • 您保存和恢复实例状态了吗?我认为这个问题类似于 [stackoverflow.com/questions/6787071/…
  • 你现在的应用行为是什么?
  • 当我旋转设备时,Activity 重新创建,因此片段被再次创建。在片段的 onResume 方法中,我调用 AsyncTask 的 execute() 方法,因此它再次加载列表。但我在屏幕上的许多应用程序中看到轮换列表不会再次加载。
  • @vovahost - 我应该更改实现吗?不过我想继续使用片段

标签: android android-fragments android-orientation


【解决方案1】:

我不确定你是否记得这个:

注意:每次用户旋转屏幕时,您的 Activity 都会被销毁并重新创建。当屏幕改变方向时,系统会销毁并重新创建前台 Activity,因为屏幕配置已更改并且您的 Activity 可能需要加载替代资源(例如布局)。

我强烈推荐你这篇文章:
使用片段处理配置更改
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

注意:为了让 Android 系统恢复 Activity 中视图的状态,每个视图必须有一个唯一的 ID,由 android:id 属性提供。

来源:http://developer.android.com/training/basics/activity-lifecycle/recreating.html

【讨论】:

  • 我这里提到我完全反对使用android:configchanges
【解决方案2】:

检查this。 本教程用于在方向更改时保留 MediaPlayer 实例。它非常直截了当。它使用片段的 setRetainInstance(true) 来保留 MediaPlayer 的方向变化。

这部分解释了在方向变化期间触发的片段的回调

onAttach - 总是

onCreate - 不在配置更改时

onStart - 总是

onResume - 总是


onPause - 总是

onStop - 总是

onDestroy - 不在配置更改时

onDetach - 总是

因此,只需在此片段中创建对服务器响应的引用,并在 onCreate 中调用服务器。

如果你想释放一些资源,你可以使用activity的isChangingConfigurations()方法来知道是因为方向改变而调用了fragment的生命周期,还是因为fragment被销毁了。

在activity中使用FragmentManager检查是否有已经存在的fragment的实例,如果没有就新建一个并添加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多