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定时器继续运行

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐