美文网首页
Fragment之间的切换

Fragment之间的切换

作者: S晔枫 | 来源:发表于2017-07-12 11:29 被阅读115次

应用场景 : 一个Activity嵌套3个Fragment f1,f2,f3
一般我们在切换时都是使用
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
TestFragment fragment = new TestFragment ();
transaction.replace(R.id.layout, fragment );
transaction.commit();
但是 发现用replace()来切换Fragment会很好性能(也很浪费流量), 每次切换时都需要重新创建Fragment ,这当然不是我们希望看到的.

优化 : 在Activity中创建一个方法

    // 先创建 对应的Fragment的实例 (全局) 
    private Fragment currentFragment = new Fragment();
    private F1 f1= new F1();
    private F2 f2= new F2();
    private F3 f3= new F3(); 
        
       /**
       * Fragment的切换 只隐藏
       */
    private FragmentTransaction switchFragment(Fragment targetFragment) {
        // 获取事物的实例
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        // 判断此fragment是否添加
        if (!targetFragment.isAdded()) {// 没有添加
            //注意 :  第一次使用switchFragment()时currentFragment为null,所以要判断一下
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            // 添加对应的fragment
            transaction.add(R.id.layout, targetFragment, targetFragment.getClass().getName());
        } else {
            transaction
                    .hide(currentFragment)
                    .show(targetFragment);
        }
        currentFragment = targetFragment;
        return transaction;
    }

  在对应的点击事件中调用
     @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.f1:
                     switchFragment(f1).commit();// 记得要commit
                break;
            ...// 后面的很简单了 一样
        }
    }

这样在切换时就只隐藏了对应的fragment ,需要时直接显示出来就行 .
还有许多不足之处, 欢迎大家一起探讨.

ps : 问题: 新项目中 需要其中的一个Fragment每次显示时都要重新请求数据(类似电商的购物车那种) ,其他几个Fragment不需要重新请求 . 这很蛋疼啊 ,后面在 google了下 发现Fragment中还真有这个问题的解决办法

// 注意 : 此方法 在 Fragment中调用
// 隐藏和显示切换时调用
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
        // 隐藏时调用 todo
    } else {
        // 显示时调用 todo
    }
}

相关文章

网友评论

      本文标题:Fragment之间的切换

      本文链接:https://www.haomeiwen.com/subject/cgtbhxtx.html