我是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;
}
});
任何有解决办法的人,请让我知道。
答案 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;
现在,在您第一次调用片段时,只需重建一次即可。从那时起,旧实例被重用。