如何在片段之间切换,而不会实际重叠前面的片段



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

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

最新更新