将片段添加到backstack时,后退按钮不起作用

时间:2017-05-16 20:28:29

标签: android android-fragments fragment-backstack

我一直在努力想出这个。

我首先会说有很多StackOverflow解决方案,但大多数人都说要自己连接onBackPressed(),工作,但我不明白为什么我没有得到使用.addToBackStack免费执行行为

在文档中找不到任何相关的内容,除非它应该有效。

我使用最简单的表单将一个片段添加到backstack

getActivity().getSupportFragmentManager().beginTransaction().add(R.id.create_fragment_holder2, new MyFragment(), TAG).addToBackStack(TAG).commit();

getActivity是一个FragmentActivity。 继续使用这个FrameLayout:

 <FrameLayout
        android:id="@+id/create_card_fragment_holder2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

带有带蓝色背景的TextView的简单片段

public class MyFragment extends Fragment{

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.my_layout, container, false);
}}

问题是,如果我不问.addToBackStack然后后退按钮将关闭包含片段,如果我这样做,后退按钮将无响应,我将永远看到蓝屏。

我找到的每个StackOverflow解决方案都说自己连接了onBackPressed(),这确实有效,但我不明白为什么我不能通过.addToBackStack免费获得这种行为 除了应该有效之外,在文档中找不到任何相关内容。

更新: 我发现它无法正常工作,因为我在活动中的onBackPress中阻止了它。所以如果没有它,它将按预期工作。这就是说,如果您需要,它是进入验证并防止其工作的好地方:)

2 个答案:

答案 0 :(得分:1)

onBackPressed()覆盖到您的活动中并调用此方法,以便从后台删除当前片段,因为您添加了它。

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
    getSupportFragmentManager().popBackStackImmediate()
} else {
    finish();
}

只有在使用addToBackStack()方法将片段添加到backstack时,这才有效。

当您向backstack添加片段以跟踪回流和所有先前的更改时,该实例将保持在FragmentManager。如果要返回上一个片段,只需从backstack弹出最新片段即可。如果不将其添加到堆栈,则无法回滚采用的路径和之前的所有操作。

答案 1 :(得分:0)

看起来你知道如何解决你遇到的问题,你的帖子似乎在问一个具体的问题,所以我会回答:

  

我不明白为什么我不能通过.addToBackStack免费获得这种行为

确实如此!但只有一点。后退按钮将自动导航回后栈,但如果没有任何内容可以导航回来,它将不会关闭最后一个片段。因此,如果您要向后堆栈添加另一个片段(而不是覆盖后退按钮),它会自动将用户导航回您的第一个片段,但之后不执行任何操作。