Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 片段Popbackstack调用替换我的根片段_Java_Android_Android Fragments - Fatal编程技术网

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

Java 片段Popbackstack调用替换我的根片段,java,android,android-fragments,Java,Android,Android Fragments,我正在使用getSupportFragmentManager()在我的main活动中填充片段A,然后在第二个和第三个片段中有按钮 MainActivity.java FrameLayout frame; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

我正在使用
getSupportFragmentManager()
在我的
main活动中填充片段A,然后在第二个和第三个
片段中有按钮

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返回时,它调用
onCreateView()
方法firstFragment,并加载SecondFragment.java。所以我不想调用Fragment First screen
onCreateView()
方法。

在main活动中,您使用add()添加第一个片段,然后在第一个和第二个片段中,您应该使用replace()

正如我从代码中看到的,您在MainActivity的onCreate()中创建了第一个片段,因此,如果以后不需要在按back键以显示MainActivity时删除它,则不应该将其添加到后堆栈中。因此,在本例中,添加第一个片段的代码是

getSupportFragmentManager().beginTransaction().add(R.id.container,new FirstFragment()).commit();
在第一个片段中,您应该使用

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

getSupportFragmentManager().beginTransaction().replace(R.id.container,new ThirdFragment()).addToBackStack("third").commit();
这样,当显示第三个片段时,按下后退按钮将显示第二个片段,然后按下后退按钮将显示第一个片段。如果在第一个片段显示时按back,您将关闭应用程序

编辑:


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

谢谢Colens,实际上我的需求是通过使用“add”来放置第二个片段如果我在主活动“add”中使用“replace”来填充第一个片段,那么第三个片段也可以使用“replace”,然后从第三个片段返回,调用第一个片段的CreateView