交换碎片而不是替换



我正在尝试创建一个类似于WhatsApp、Viber等的底部导航菜单,在其中我在片段之间切换。我用fragmentManager替换了一些片段,但事实证明,当我想回到我以前访问过的菜单页面时,这会重新创建替换的片段。

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment fragment = null;
switch (item.getItemId()) {
case R.id.navigation_discover:
fragment = findFragment(RPageFragment.getTAG());
if(fragment == null){
fragment = RPageFragment.newInstance();
mFragmentManager.beginTransaction().add(R.id.fragment_container, fragment, fragment.getTag()).commit();
}
break;
case R.id.navigation_booked:
fragment = findFragment(MapViewFragment.getTAG());
if(fragment == null){
fragment = MapViewFragment.newInstance();
mFragmentManager.beginTransaction().add(R.id.fragment_container, fragment, fragment.getTag()).commit();
}
break;
case R.id.navigation_me:
fragment = findFragment(ProfilePageFragment.getTAG());
if(fragment == null){
fragment = ProfilePageFragment.newInstance();
mFragmentManager.beginTransaction().add(R.id.fragment_container, fragment, fragment.getTag()).commit();
}
break;
}
//Invalid menu option
if (fragment == null)
return false;
mFragmentManager.beginTransaction().replace(R.id.fragment_container,fragment).commit();
return true;
}

有没有任何方法可以交换碎片,同时保留它们的视图、状态等,类似于Whatsapp的工作方式?(例如,我有一个mapView片段,当我回到它时,我希望显示我离开它的方式,而不是重新创建mapView(

您可以使用How来实现具有不同碎片/布局的ViewPager

你可以简单地检查碎片对象null是否像下面的例子一样:

case R.id.navigation_me:
fragment = findFragment(ProfilePageFragment.getTAG());
if (fragment == null) {
mFragmentManager.beginTransaction().show(fragment);
} else {
fragment = ProfilePageFragment.newInstance();
mFragmentManager.beginTransaction().add(R.id.fragment_container, fragment, fragment.getTag()).commit();
}
// and you can hide all other fragments here with
fragmentRPage = findFragment(RPageFragment.getTAG());
if (fragmentRPage == null) {
mFragmentManager.beginTransaction().hide(fragmentRPage);
}
fragmentMapView = findFragment(MapViewFragment.getTAG());
if (fragmentMapView == null) {
mFragmentManager.beginTransaction().hide(fragmentMapView);
}
//... and hide other fragments
break;

最新更新