如何在不实际重叠先前片段的情况下在片段之间切换

How to switch between fragments without actually overlapping the previous fragments

我是 Android 开发新手,我正在尝试创建一个基于 BottomNavgiationView 的应用程序。底部导航项之一有一个 editText,因此当我切换到另一个片段时,我写东西的前一个片段由于替换而重叠。

这是我的 OnNavigationItemSelectedListener

private void enableNavigation(){
    bottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()){
                case R.id.btnHome:
                    HomeFragment homeFragment = new HomeFragment();
                    android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
                    manager.beginTransaction().replace(R.id.container, homeFragment).commit();
                    return true;
                case R.id.btnChats:
                    ChatsFragment chatsFragment = new ChatsFragment();
                    android.support.v4.app.FragmentManager manager1 = getSupportFragmentManager();
                    manager1.beginTransaction().replace(R.id.container, chatsFragment).commit();
                    return true;
                case R.id.btnPost:
                    PostsFragment postsFragment = new PostsFragment();
                    android.support.v4.app.FragmentManager manager2 = getSupportFragmentManager();
                    manager2.beginTransaction().replace(R.id.container, postsFragment).commit();
                    return true;
                case R.id.btnFavourites:;
                    FavouritesFragment favouritesFragment = new FavouritesFragment();
                    android.support.v4.app.FragmentManager manager3 = getSupportFragmentManager();
                    manager3.beginTransaction().replace(R.id.container, favouritesFragment).commit();
                    return true;
                case R.id.btnProfile:
                    ProfileFragment profileFragment = new ProfileFragment();
                    android.support.v4.app.FragmentManager manager4 = getSupportFragmentManager();
                    manager4.beginTransaction().replace(R.id.container, profileFragment).commit();
                    return true;
            }
            return false;
        }
    });

任何人有任何解决方案请告诉我..

我假设你的意思是 instance。每次切换片段时,都会创建一个 new 实例并打开它。所以要停止这样做,你必须保持第一个实例的构建,并在你想切换到它时将它交给片段管理器。

例如,让我们使用您的ChatFragment

不是在 switch 语句中,而是将 ChatsFragment chatsfragment 声明放在 Activity 的顶部,因此它是一个实例范围的变量。在你的 switch 语句中,你不必每次都构建一个新实例,而是去

case R.id.btnChats:
  if(chatsFragment == null) chatsFragment = new ChatsFragment();
  android.support.v4.app.FragmentManager manager1 = getSupportFragmentManager();
  manager1.beginTransaction().replace(R.id.container, chatsFragment).commit();
  return true;

现在您只需在首次调用片段时重建片段一次。从那时起,旧实例将被重用。