如何只保存第一个片段

时间:2016-07-11 01:27:53

标签: android android-fragments

我在我的主要活动中创建了一个框架布局,并在应用程序启动时将片段1添加到布局中。

Fragment fr;
fr = new fragment1();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit(); 

此后,当用户按下片段1上的内容时,它将启动片段2。

Fragment2 newFragment = new Fragment2();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_place, newFragment);
transaction.addToBackStack(null);
transaction.commit();

现在的问题是当我按下片段2上的后退按钮时,它将返回到片段1但重新加载片段1.当我再次按下后退按钮时,它将再次返回到片段2。任何人都可以帮我解决这个问题,因为我只希望片段1一直保存,片段2在用户按下后退按钮时会被破坏。

3 个答案:

答案 0 :(得分:0)

  

当我再次按下按钮时,它将再次回到片段2。

这是因为当你加载片段2时,你将它添加到了backstack中,所以删除这行代码

Fragment2 newFragment = new Fragment2();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_place, newFragment);
//transaction.addToBackStack(null); <-- remove this
transaction.commit();
  

现在的问题是当我按下片段2上的后退按钮时,它会   回到片段1但重新加载片段1。

如果从后台堆栈返回一个片段,它不会重新创建片段,而是重新使用相同的实例,并从片段生命周期中的onCreateView()开始,请参阅Fragment Lifecycle。这个答案来自here

答案 1 :(得分:0)

  

首次向活动添加片段时需要编写   fragmentTransaction.add(R.id.fragment_place,fr)而不是fragmentTransaction.replace(R.id.fragment_place,fr);

您是第一次从MainActivity初始化片段1,因此您的代码看起来像这样

Fragment fr;
fr = new fragment1();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.add(R.id.fragment_place, fr);
fragmentTransaction.commit(); 

你看我也删除了fragmentTransaction.addToBackStack(null);来自我的代码。

<强>由于

  

你说当你去片段1然后按回按钮它会返回片段2.那是因为你添加了fragmentTransaction.addToBackStack(null);到第一个片段片段。所以当你回到片段1时,android会在片段1的后面堆栈中添加片段2.所以当你按下后退按钮时它会返回到片段2。

当你从片段转到另一个片段时,你需要使用fragmentTransaction.replace();

您的最终代码如下所示

Fragment fr;
fr = new fragment1();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.add(R.id.fragment_place, fr);
fragmentTransaction.commit();

Fragment2 newFragment = new Fragment2();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_place, newFragment);
transaction.addToBackStack(null);
transaction.commit();

希望这有帮助!

答案 2 :(得分:0)

我找到一种简单的方法。 kotlin code

    var fragmentManager = supportFragmentManager
    if (getSupportFragmentManager().getBackStackEntryCount() > 0)
         fragmentManager
        .beginTransaction()
        .replace(R.id.frg_holder, yourNewFragment)
        .commit()
    else
        fragmentManager
        .beginTransaction()
        .replace(R.id.frg_holder, yourNewFragment)
        .addToBackStack("tag")
        .commit()