嘿伙计我正在使用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()
方法。
答案 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。