如何在片段之间切换而又不与先前的片段实际重叠

时间:2018-06-25 06:16:26

标签: android android-fragments android-fragmentactivity

我是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;
        }
    });

任何有解决办法的人,请让我知道。

1 个答案:

答案 0 :(得分:2)

我认为您的意思是instance。每次切换片段时,您都会创建一个new实例并打开它。因此,要停止这样做,必须保留第一个实例的构建,并在要切换到片段管理器时将其交给片段管理器。

例如,让我们使用您的ChatFragment

您可以将ChatsFragment chatsfragment声明放在Activity的顶部,而不是在switch语句中,因此它是一个实例范围的变量。在您的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;

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