我有两个片段片段a 和 fragment b 。当i从片段转到到 fragment b 我使用addtobackstack(null)
在背包中添加 fragment a ,也使用replace()
方法。问题是当我从片段调用 popbackstack()
时,fragment b -> fragment a 然后再次调用 OnCreateView()
and onViewCreated()
,然后再次加载回收器视图中的 fragment a 我知道所有实例都没有再次加载但是问题是我不想再次加载视图。前任。在我打电话完成的活动中,先前的活动与我们离开时相同。
NOTE :我不想在beginTransaction
中使用add()
方法,因为它重叠了其他片段。
谢谢
参考:
添加和替换之间的另一个重要差异是:替换 去除现有片段并添加新片段。这意味着什么时候 您按向后按钮将创建被替换的片段 它被调用。而添加保留了现有的 片段并添加一个新片段,这意味着现有片段将是 活跃,它们不会处于"暂停"状态,因此当返回按钮时 按下的otCreateview并未为现有片段调用( 在添加新片段之前就在那里的碎片)。 碎片的生命周期事件Onpause,resume,onCreateview和其他 生命周期事件将在替换的情况下被调用,但它们不会 在添加的情况下调用。
简而言之,对于用例,您需要使用add
,如果您不希望片段视图重叠,则可以用固体颜色而不是透明替换Fragment B
查看背景颜色。
也不要忘记将android:clickable="true"
添加到第二片片段的父视图中,因此它可以捕获点击,并且不会传播到下面的片段。这样的东西:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true">
f您将片段添加到android.support.v4.app.fragmentManager您还必须在同一FragmentManager上调用PopBackStack()。
此代码应解决问题:
if (getSupportFragmentManager().getBackStackEntryCount() > 0){
boolean done = getSupportFragmentManager().popBackStackImmediate();
}