片段在旋转时没有被破坏

Run*_*oop 5 android android-fragments

我有一个以编程方式添加的片段.然而,我发现在旋转之后,会创建一个新片段,但旧片段仍处于活动状态(虽然没有显示)我假设片段与旋转活动一起被销毁,但这不是这里的情况.什么可能导致我的片段被保留/不被破坏?请注意:

  1. 我没有设置setRetainInstance.
  2. 该片段未添加到onCreate活动中(稍后在点击按钮时添加)
  3. 我可以看到onDestroy在旋转时被调用
  4. 虽然添加了片段,但它会模糊添加按钮,只有在我执行"删除"时才会被删除.

创建片段的代码:

MyFragment fragment = MyFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.content_frame, fragment, "CurrentFragment");
fragmentTransaction.show(fragment).commit();
Run Code Online (Sandbox Code Playgroud)

删除片段的代码:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragment).commit();
Run Code Online (Sandbox Code Playgroud)

更新:我无法确认这是否是问题,但片段在onCreate中注册为LocalBroadcast接收器.它在onDestroy中未注册广播,但似乎LocalBroadcast注册阻止调用onDestroy,或者在旋转时没有调用onDestroy.我现在在onStop中取消注册,这似乎解决了这个问题.

tha*_*sma 15

当由于方向更改而重新启动Activity时,Android Framework会自动为您重新创建并添加Fragment.你可能添加的片段在onCreate你的Activity.这是您在方向更改后添加其他片段的位置.

您必须检查是否已添加片段:

Fragment f = getFragmentManager().findFragmentById(R.id.content_frame);
if(f == null){
    //Add it, there is no Fragment
}else{
    //It's already there
}
Run Code Online (Sandbox Code Playgroud)

每次你添加添加片段的按钮时,都会添加一个新的片段.如果您的容器是FrameLayout,您可能不会看到它.尝试替换碎片:

fragmentTransaction.replace(R.id.content_frame, fragment, "CurrentFragment");
Run Code Online (Sandbox Code Playgroud)

该方法setRetainInstance(true)有另一个目的.如果启用它,则Fragment方向更改时不会销毁实例(但其视图将被销毁).这意味着您可以将数据存储在a的成员变量中,Fragment并且在方向更改后该数据仍然可用.

设置setRetainInstance(true)片段的生命周期时略有不同.即onCreate(),onDestroy()并没有被调用(因为那些事件没有发生)