我创建了包含5个项目的底部导航视图。在项目多次单击时,将重新创建片段并多次存储到堆栈中。我想恢复片段(如果它在堆栈中可用)而不弹出其他片段。
MainActivity.java
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.feed:
String feed_tag = getResources().getString(R.string.feed_tag);
if(!getSupportFragmentManager().popBackStackImmediate(feed_tag, 0)){
//fragment is not in backStack, create it
FeedFragment f1=new FeedFragment();
FragmentTransaction ft1 = getSupportFragmentManager().beginTransaction();
ft1.replace(R.id.fragment_container, f1, feed_tag).addToBackStack(feed_tag);
ft1.commit();
}
return true;
case R.id.search:
String search_tag = getResources().getString(R.string.search_tag);
if((!getSupportFragmentManager().popBackStackImmediate(search_tag, 0)) {
SearchFragment f3 = new SearchFragment();
FragmentTransaction ft3 = getSupportFragmentManager().beginTransaction();
ft3.replace(R.id.fragment_container, f3, search_tag).addToBackStack(search_tag);
ft3.commit();
}
return true;
case R.id.post:
String post_tag = getResources().getString(R.string.post_tag);
if(!getSupportFragmentManager().popBackStackImmediate(post_tag, 0);) {
Post postBase = new Post();
FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction();
ft2.replace(R.id.fragment_container, postBase, post_tag).addToBackStack(post_tag);
ft2.commit();
}
return true;
case R.id.noti:
String noti_tag = getResources().getString(R.string.notification_tag);
if(!getSupportFragmentManager().popBackStackImmediate(noti_tag, 0)) {
NotificationFragment f4 = new NotificationFragment();
FragmentTransaction ft4 = getSupportFragmentManager().beginTransaction();
ft4.replace(R.id.fragment_container, f4, noti_tag).addToBackStack(noti_tag);
ft4.commit();
}
return true;
case R.id.profile:
String profile_tag = getResources().getString(R.string.profile_tag);
if(!getSupportFragmentManager().popBackStackImmediate(profile_tag, 0)) {
Fragment f5 = ProfileFragment.getInstance("val1", "val2");
FragmentTransaction ft5 = getSupportFragmentManager().beginTransaction();
ft5.replace(R.id.fragment_container, f5, profile_tag).addToBackStack(profile_tag);
ft5.commit();
}
return true;
}
return false;
}
};
如果使用POP_BACK_STACK_INCLUSIVE标志,则我单击的片段也将被删除,并且该片段位于后堆栈中单击的片段之下。
如何在不重新创建的情况下从后台获取已经添加的片段?
您可以这样做。无需重新创建:
val firstFragment: Fragment = FirstFragment()
val secondFragment: Fragment = SecondFragment()
val thirdFragment: Fragment = ThirdFragment()
val navView: BottomNavigationView = findViewById(R.id.nav_view)
var active = firstFragment
fm.beginTransaction().add(R.id.nav_host_fragment, thirdFragment, "3").hide(thirdFragment).commit()
fm.beginTransaction().add(R.id.nav_host_fragment, secondFragment, "2").hide(secondFragment).commit()
fm.beginTransaction().add(R.id.nav_host_fragment, firstFragment, "1").commit()
navView.setOnNavigationItemReselectedListener { }
navView.setOnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_first -> {
fm.beginTransaction().hide(active).show(firstFragment).commit()
active = firstFragment
}
R.id.navigation_second -> {
fm.beginTransaction().hide(active).show(secondFragment).commit()
active = secondFragment
}
R.id.navigation_third -> {
fm.beginTransaction().hide(active).show(thirdFragment).commit()
active = thirdFragment
}
}
true
}