如何在不实际重叠先前片段的情况下在片段之间切换
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;
现在您只需在首次调用片段时重建片段一次。从那时起,旧实例将被重用。
我是 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;
现在您只需在首次调用片段时重建片段一次。从那时起,旧实例将被重用。