我在我的主要活动中创建了一个框架布局,并在应用程序启动时将片段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在用户按下后退按钮时会被破坏。
答案 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()