gpt4 book ai didi

android - fragment 不会在旋转时被破坏

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:51:23 25 4
gpt4 key购买 nike

我有一个以编程方式添加的 fragment 。然而,我发现在旋转之后,创建了一个新 fragment ,但旧 fragment 仍然存在(虽然没有显示)我假设 fragment 随着旋转 Activity 而被破坏,但这里不是这种情况。是什么导致我的 fragment 被保留/未被销毁?请注意:

  1. 我没有设置 setRetainInstance。
  2. fragment 未添加到 onCreate Activity 中(稍后在点击按钮时添加)
  3. 我可以看到 onDestroy 正在为旋转时的 Activity 调用
  4. 虽然添加了 fragment ,但它遮盖了添加按钮,并且只有在我执行“删除”时才会消失。

创建 fragment 的代码:

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

删除 fragment 的代码:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragment).commit();

更新:我无法确认这是否是问题所在,但该 fragment 在 onCreate 中注册为 LocalBroadcast 接收器。它在 onDestroy 中取消了广播注册,但似乎是 LocalBroadcast 注册阻止了 onDestroy 被调用,或者 onDestroy 没有在轮换时被调用。我现在在 onStop 中注销,这似乎解决了问题。

最佳答案

当 Activity 由于方向更改而重新启动时,Android Framework 会自动为您重新创建并添加 Fragment。您可能在 ActivityonCreate 中添加 fragment 。这是您在方向更改后添加额外 fragment 的地方。

您必须检查 fragment 是否已添加:

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

每次点击添加 fragment 的按钮,都会添加一个新的 fragment 。如果您的容器是 FrameLayout,您可能看不到它。尝试替换 fragment :

fragmentTransaction.replace(R.id.content_frame, fragment, "CurrentFragment");

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

设置 setRetainInstance(true) 时, fragment 的生命周期略有不同。 IE。 onCreate()onDestroy() 没有被调用(因为那些事件没有发生)

关于android - fragment 不会在旋转时被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20401778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com