• Android Fragment使用小结及介绍


    目录(?)[-]
    
    一什么是Fragment
    二Fragment的生命周期
    三Fragment的两种添加方式addreplace
    四两种添加方式性能比较
    View Code

    偶记得第一次接触Fragment,觉得好牛叉的组件,可以做许多Activity可以做的事,辅助Activity让功能可以做得更加强大;一次编写,可以多个地方可以使用,解放了Activity。在这里,本篇文章主要是总结fragment的两种添加方式,add和replace。

    一、什么是Fragment

    简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

    使用Fragment还有这么几个方面优势:

    • 代码复用。特别适用于模块化的开发,因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了,是模块化UI的良好组件。
    • Activity用来管理Fragment。Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。
    • 可控性。Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。
    • Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。

    二、Fragment的生命周期

    Fragment的生命周期类似Activity,如下图,Activity生命周期与Fragment生命周期对比图:

    三、Fragment的两种添加方式(add&replace)

    Fragment添加与FragmentManager与FragmentTransaction息息相关。add和replace都是FragmentTransaction的方法。除这两个方法,其中还有remove,hide和show方法。

    FragmentManager与FragmentTransaction的获取:

    FragmentManager frgmentManager = getFragmentManager() // v4中,getSupportFragmentManager
    FragmentTransaction transaction = frgmentManager.benginTransatcion();

    1.项目中多个Fragment,add方式添加

    i.添加代码

     1 public void add(BaseLibFragment fragment, int id,String tag){
     2         FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager();
     3         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
     4         //优先检查,fragment是否存在,避免重叠
     5         BaseLibFragment tempFragment = (BaseLibFragment)fragmentManager.findFragmentByTag(tag);
     6         if(EmptyUtils.isNotEmpty(tempFragment)){
     7             fragment = tempFragment;
     8         }
     9         if(fragment.isAdded()){
    10             addOrShowFragment(fragmentTransaction,fragment,id,tag);
    11         }else{
    12             if(currentFragment!=null&&currentFragment.isAdded()){
    13                 fragmentTransaction.hide(currentFragment).add(id, fragment,tag).commit();
    14             }else{
    15                 fragmentTransaction.add(id, fragment,tag).commit();
    16             }
    17             currentFragment = fragment;
    18         }
    19     }
    20     /**
    21      * 添加或者显示 fragment
    22      *
    23      * @param fragment
    24      */
    25     private void addOrShowFragment(FragmentTransaction transaction, BaseLibFragment fragment, int id,String tag) {
    26         if(currentFragment == fragment)
    27             return;
    28         if (!fragment.isAdded()) { // 如果当前fragment未被添加,则添加到Fragment管理器中
    29             transaction.hide(currentFragment).add(id, fragment,tag).commit();
    30         } else {
    31             transaction.hide(currentFragment).show(fragment).commit();
    32         }
    33         currentFragment.setUserVisibleHint(false);
    34         currentFragment =  fragment;
    35         currentFragment.setUserVisibleHint(true);
    36     }

    ii.添加顺序

    • 第一次添加,先hide(隐藏)currentFragment,再add(添加)新Fragment。生命周期会按正常流程走,onCreate->onResume
    • 第二次添加,先hide(隐藏)currentFragment,在show(显示)老Fragment。生命周期不会重新走,会调用onHiddenChanged(),展示fragment的显示状态,我们可以在此做一些刷新数据操作。

    iii.add方式Fragment重叠BUG解决方案 
    为fragment设置Tag,通过findFragmentByTag查找是否存在,然后再添加

    1 //优先检查,fragment是否存在,避免重叠
    2         BaseLibFragment tempFragment = (BaseLibFragment)fragmentManager.findFragmentByTag(tag);
    3         if(EmptyUtils.isNotEmpty(tempFragment)){
    4             fragment = tempFragment;
    5         }

    2.项目中多个Fragment,replace方式添加 
    i.添加代码

    1 public void replace(BaseLibFragment fragment, int id){
    2         FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager();
    3         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    4         fragmentTransaction.replace(id, fragment);
    5         fragmentTransaction.commit();
    6     }

    ii.添加方式 
    添加方式比较直接,直接替换。在这过程中因为是替换,第一和第二次添加没啥区别,生命周期都要重新执行一次

    四、两种添加方式性能比较

    标准的四大金刚模式。底部四个Item,通过Fragment内容切换,此种方式add与replace性能对比,如下两图:

    add方式

    replace方式

  • 相关阅读:
    Git 命令 stash cherry-pick reset rebase
    【操作系统】不同语言的线程实现机制对比及数据库锁问题
    【数据结构】搜索二叉树(BST)和普通二叉树的序列化与反序列化
    【自制编译器】读书笔记 -- JavaCC使用的JJ文件格式
    leetcode 874 Robot Simulation
    hihocoder 编程挑战赛75
    浪漫主义的起源--以赛亚柏林
    【美团笔试 2018-4-20 】编程题-1 测例100%通过 欧拉函数求解gcd
    【POJ SOJ HDOJ】HDU 2196 Computer 树中的最长路径
    【Java 核心】多线程笔记
  • 原文地址:https://www.cnblogs.com/edensyd/p/8819402.html
Copyright © 2020-2023  润新知