片段Popbackstack调用替换我的根片段

时间:2017-12-03 10:25:40

标签: java android android-fragments

嘿伙计我正在使用getSupportFragmentManager()填充MainActivity中的片段A ,然后我在第二个和第三个Fragment中有按钮。

MainActivity.java

FrameLayout frame;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    frame = (FrameLayout)findViewById(R.id.container);
    getSupportFragmentManager().beginTransaction().add(R.id.container,new FirstFragment()).addToBackStack("first").commit();
}

FirstFragment.java同时点击按钮我正在导航到 SecondFragment

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_first, container, false);
        Log.d("TAG","First Fragment OncreateView");
        clicButton = rootView.findViewById(R.id.click);
        clicButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container,new SecondFragment()).addToBackStack("second").commit();
            }
        });
        return rootView;
    }

现在当我点击 firstfragment 按钮时我正在做什么我正在使用“添加”添加 SecondFragment secondFragment 我我正在使用“替换”前往 thirdFragment

我遇到的问题是,当我从 thirdFragment 返回时,它会调用 firstFragment onCreateView()方法并加载 SecondFragment < /strong>.java。所以我不想调用Fragment First屏幕onCreateView()方法。

1 个答案:

答案 0 :(得分:0)

在MainActivity中,使用add()添加第一个片段,然后在第一个和第二个片段中使用replace()。

正如我从您的代码中看到的那样,您在MainActivity的onCreate()中创建了第一个片段,因此如果您不需要在以后按下以删除它以显示您的MainActivity,那么您不应该& #39; t将其添加到后台堆栈。所以在这种情况下,添加第一个片段的代码将是

getSupportFragmentManager().beginTransaction().add(R.id.container,new FirstFragment()).commit();

在第一个片段中,您应该使用

getSupportFragmentManager().beginTransaction().replace(R.id.container,new SecondFragment()).addToBackStack("second").commit();

Andin第二次

getSupportFragmentManager().beginTransaction().replace(R.id.container,new ThirdFragment()).addToBackStack("third").commit();

这样当第三个片段显示时,按后退按钮将显示第二个片段,然后按下后退按钮将显示第一个片段。如果您在显示第一个片段时按回,则会关闭您的应用。

修改

好的,你通过调用add()显示你的第一个和第二个片段。问题是当你从第二个到第三个片段调用replace()而不是add()时,调用replace()相当于为第一个和第二个片段调用remove(),然后为第三个片段调用add()(因为这就是replace()做的事情 - 删除所有先前的片段,然后添加新的片段)。然后addToBackStack记录该事务。因此,当您从后台堆栈中弹出该事务时,您将添加第一个和第二个片段(第二个片段位于第一个片段之上,因此第二个片段可见),因此也会为两个片段调用onCreateView。