在 FrameLayout 中添加一个 fragment 并隐藏下面的 fragment

Add a fragment to FrameLayout and hide the fragment below

情况:

我有一个带有 FrameLayout 的 activity,我可以在其中更改片段。 我使用:

getSupportFragmentManager().beginTransaction() .replace(R.id.content, fragment) .addToBackStack("name") .commit)

一切正常,问题是当我返回堆栈时,前一个片段被重新加载,所有数据都丢失了。

可能的解决方案:

问题:

我如何使用“.add(R.id.content,fragment)”并以某种方式隐藏它下面的片段,这样它就不会覆盖,我可以回到我离开它时的前一个片段.

首先我要说的是,如果您不希望用户返回到上一个片段,则无需将片段添加到后台堆栈。

为了回答另一个问题,FragmentManager 有一个 "hide" 方法,您可以使用该方法将片段保留在 FragmentManager 中,但对用户隐藏它。然后用"show"再次显示出来

final Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
    .add(R.id.content, fragment)
    .hide(oldFragment)
    .addToBackStack("name")
    .commit)

如第一句所述,将弹出片段,并在用户按下 "back" 时显示旧片段。如果您不希望这种情况发生,只需删除 addToBackStack()

用于保存数据
您可以在替换片段时使用 Activity,activity 是实时的。

        public class MotherActivity extends ActionBarActivity { 
                     private Data data = null;

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_adv);


           Fragment oldFragment = methodToGetFragment();
    getSupportFragmentManager().beginTransaction()
        .add(R.id.content, fragment)
        .hide(oldFragment)
        .addToBackStack("name")
        .commit)



        }
public void setData(Data data){
....
}

public void getData(){
....}

    }


public class FirstFragment extends Fragment {

    private AdvActivity act;

......

  public void onAttach(Activity activity) {
        super.onAttach(activity);
        // get data from internet
        Data data=getData();
        // and save data in mother activity
        activity.setData(data);

    }

第二个片段:

public class SecondFragment extends Fragment {

    private AdvActivity act;
    private Data data;

......

  public void onAttach(Activity activity) {
        super.onAttach(activity);
        // get data from mother activity
        data=activity.getData();

    }