片段布局在popBackStack上重叠

时间:2018-09-01 09:44:47

标签: android android-fragments fragment

片段A

 View rootView = inflater.inflate(R.layout.fragment_a, container, false);
        TextView tvTest = (TextView) rootView.findViewById(R.id.tvTest);
        tvTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, new FragmentB()).addToBackStack("tag").commit();            }
        });
        return rootView;

片段B

 View rootView = inflater.inflate(R.layout.fragment_b, container, false);
    TextView tvTest = (TextView) rootView.findViewById(R.id.tvTest);
    tvTest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, new FragmentC()).commit();            }


    });
    return rootView;

片段C

View rootView = inflater.inflate(R.layout.fragment_c, container, false);
TextView tvTest = (TextView) rootView.findViewById(R.id.tvTest);
tvTest.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        getActivity().getSupportFragmentManager().popBackStack();
    }
});
return rootView;
}

点击片段C 中的tvTest时,我看到片段A和片段C的布局彼此重叠

预期行为- 在用片段B替换片段C时,片段B被销毁了,因为它没有addToBackStack()的替换事务。现在在片段C中使用popBackStack()时,片段C应该被破坏并且片段A应该清晰可见。

1 个答案:

答案 0 :(得分:2)

这是因为FragmentManager后堆栈是如何工作的。它是FragmentTransaction的堆栈,不是 Fragment

您的代码具有以下交易记录。

  • A-> B(将事务添加到后堆栈)
  • B-> C
然后

C弹出后堆栈(它使堆栈中的最后一个事务反转(A-> B))-变成B->A。这将导致A和C都可见。