切换Fragment的方法
1 简单粗暴replace该方法只是在上一个Fragment不再需要时采用的简便方法。不需要类成员变量,每次替换掉当前的fragment,每次从零开始,不保存数据。//切换不同的fragmentprivate void replaceFragment(Fragment fragment) {FragmentManager manager = getSupportFragmentManager();
·
1 简单粗暴replace
该方法只是在上一个Fragment不再需要时采用的简便方法。
不需要类成员变量,每次替换掉当前的fragment,每次从零开始,不保存数据。
//切换不同的fragment
private void replaceFragment(Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = manager.beginTransaction();
fragmentTransaction.replace(R.id.nav_host_fragment, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
使用样例 ,每次都是重新构造一个fragment,fragment数量较多或依赖网络数据时,可能比较卡顿。
replaceFragment(new HomeFragment());
2 使用hide和show切换,保存数据
本质上只是把其他fragment隐藏起来,只显示当前的一个。
需要设置类成员变量并初始化
//设置fragment为类成员
private Fragment homeFragment=new HomeFragment();
private Fragment dashFragment=new DashboardFragment();
private Fragment notiFragment=new NotificationsFragment();
private Fragment currentFragment=new HomeFragment();
//正确的做法,切换fragment
private void switchFragment(Fragment targetFragment) {
//已经显示就不切换
if(currentFragment == targetFragment)
return ;
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
//没有添加则先完成添加再显示
if (!targetFragment.isAdded()) {
transaction
.hide(currentFragment)
.add(R.id.nav_host_fragment, targetFragment)
.commit();
Log.i(TAG, "第一次添加 ");
} else {//都添加了就直接隐藏当前fragment,显示目标fragment
transaction
.hide(currentFragment)
.show(targetFragment)
.commit();
Log.i(TAG,"完成切换");
}
currentFragment = targetFragment;
}
使用样例
switchFragment(dashFragment);
效果图,切换后,主页的fragment定时器继续运行



更多推荐


所有评论(0)