相关疑难解决方法(0)

Android片段在方向更改时重新创建

我正在开发一个基本上有ActionBar的应用程序.当我的应用程序启动时,Activity会创建片段并将它们附加到每个选项卡,因此当我切换时,我会得到不同的视图.

当我尝试旋转设备时出现问题.经过一番努力,我注意到Android会自动重新创建以前添加的片段,如下所示:

SummaryFragment.onCreate(Bundle) line: 79   
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795  
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032  
FragmentManagerImpl.moveToState(int, boolean) line: 1014    
FragmentManagerImpl.dispatchCreate() line: 1761 
DashboardActivity(Activity).onCreate(Bundle) line: 864  
...
Run Code Online (Sandbox Code Playgroud)

然后像往常一样重新创建片段.因此,我希望能够正常工作的"真实"片段以及使我的应用程序崩溃的"隐藏"Android创建的对应物.我该如何避免这种行为?我已经尝试在SummaryFragment中调用setRetainInstance(false).

谢谢

android android-fragments android-orientation

14
推荐指数
1
解决办法
2万
查看次数

方向更改后每次重新创建片段,无法恢复状态

更新:事实证明问题来自其他地方.感谢@Luksprog指出我忽略了什么.

  1. 该项目是使用Android Studio的导航抽屉图案创建的.抽屉在NavigationDrawerFragment课堂上实施.
  2. 当选择抽屉中的特定项目时,添加包含视图寻呼机的片段.代码实现了我的家庭活动.
  3. 当屏幕旋转时,调用onCreate()方法NavigationDrawerFragment,保留最后选择的项目.
  4. 这里出了什么问题 - 在娱乐时,NavigationDrawerFragment会再次调用selectItem(),这会触发我的菜单项选择处理程序.这会导致Android恢复ListFragment.

通过检查菜单选择处理程序代码中的活动菜单项可以防止这种情况.


我想保留最后一个查看页面索引,该索引ViewPager是由任何原因重新创建活动的时间,例如方向更改.

ViewPager是在Fragment(命名ListFragment),其被附接到的活性.我正在使用compat库,因此片段是它的子类android.support.v4.app.Fragment.

我认为可以通过覆盖onSaveInstanceState()方法并添加适当的逻辑来完成onCreate(),如文档中所述:

要正确处理重新启动,您的活动必须通过正常的Activity生命周期恢复其先前的状态,在此生命周期中Android会在销毁活动之前调用onSaveInstanceState(),以便您可以保存有关应用程序状态的数据.然后,您可以在onCreate()或onRestoreInstanceState()期间恢复状态.

但是片段的情况似乎不同.当我从此导航ListFragment到另一个活动并按下"返回" 时,可以正确恢复页面索引.但是,当我旋转设备时,页面索引会丢失.

我添加了一些日志记录,看看有什么问题.从日志中我发现,虽然onSaveInstanceState()ListFragment(我称之为ListFragment A)正确调用,这个特殊的片段类不再在活动中.当方向改变并重新创建活动时,Android调用onSaveInstanceState()后跟onDetach()分离此片段.然后,Android会创建一个新实例ListFragment(我将其命名为ListFragment B)并将其附加到新的旋转活动中.此ListFragment B将空savedInstanceState传递给构造函数,因此最后一页索引(以及片段A的savedInstanceState中的任何配置)都将丢失.

实际上,ListFragment每次屏幕旋转时都会创建一个新实例,但似乎旧的实例不会被销毁.我在旋转设备时会看到如下所示的日志:

D/ListFragment? [1110257048] onSaveInstanceState() called, storing last page index 3
D/ListFragment? [1109835992] onSaveInstanceState() called, storing last page index 0
D/ListFragment? …
Run Code Online (Sandbox Code Playgroud)

android android-configchanges android-fragments

8
推荐指数
2
解决办法
1万
查看次数