处理运行时方向更改android

时间:2014-11-04 22:47:38

标签: android android-fragments android-orientation

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

警告:每次用户旋转屏幕时,您的活动都将被销毁并重新创建。当屏幕更改方向时,系统会破坏并重新创建前台活动,因为屏幕配置已更改,您的活动可能需要加载其他资源(例如布局)。

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

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

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

答案 1 :(得分:1)

检查this。 本教程用于跨方向更改保留MediaPlayer实例。它很直接。它使用片段的setRetainInstance(true)来保留MediaPlayer而不是方向更改。

这部分解释了在定向chage期间触发的片段的回调

  

onAttach - 总是

     

onCreate - 不是配置更改

     

onStart - 总是

     

onResume - 总是

           

onPause - 总是

     

onStop - 始终

     

onDestroy - 不是配置更改

     

onDetach - 总是

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

您可以使用activity的isChangingConfigurations()方法来了解是否因为方向更改而调用了片段的生命周期,或者如果要释放某些资源,则会破坏片段。

在活动中使用FragmentManager检查片段的实例是否已经存在,如果没有创建新实例并添加它。