我有两个片段 FRAGMENT A 和 FRAGMENT B 。当我从 FRAGMENT A 转到 FRAGMENT B 时,我正在同时使用addtobackstack(null)
和replace()
在堆栈中添加 FRAGMENT A 方法。问题是,当我从 FRAGMENT B -> FRAGMENT A 呼叫popbackstack()
之后,OnCreateView()
和onViewCreated()
再次呼叫并加载时再次在 FRAGMENT A 中查看回收者视图。我知道所有实例都不会再次加载
但是问题是我不想再次加载视图。例如当我打完电话时,活动仍保持不变。
注意:我不想在add()
中使用beginTransaction
方法,因为它与其他片段重叠。
谢谢
答案 0 :(得分:1)
添加和替换之间的另一个重要区别是:替换 删除现有片段并添加一个新片段。这意味着 您按返回按钮将创建被替换的片段 其onCreateView被调用。而add保留了现有的 片段并添加一个新片段,这意味着现有片段将是 处于活动状态,因此不会处于“已暂停”状态 按下onCreateView不会调用现有的片段( 添加新片段之前的片段)。 在 片段的生命周期事件onPause,onResume,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">
答案 1 :(得分:0)
如果您要将Fragments添加到android.support.v4.app.FragmentManager,则还必须在同一FragmentManager上调用popBackStack()。
此代码应该可以解决问题:
if (getSupportFragmentManager().getBackStackEntryCount() > 0){
boolean done = getSupportFragmentManager().popBackStackImmediate();
}