V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JustKiddingBaby
V2EX  ›  Android

这样设计 Fragment 你有什么看法?

  •  
  •   JustKiddingBaby · 2018-01-02 10:03:08 +08:00 · 9485 次点击
    这是一个创建于 2517 天前的主题,其中的信息可能已经有所发展或是发生改变。

    近期开源了一个基于 AOP 的 Fragment 管理框架FragmentRigger
    目的有两点:

    • 使用成本最低的 Fragment 框架。
    • 让 Fragment 的使用更简单。

    项目传送门

    这不是重复造轮子

    疑问一: 你可能会问了,网上关于 Fragment 的框架不是一抓一大把,为什么还要重复造轮子呢?

    是的,关于Fragment的框架在网上是比较多的,如比较出名的YoKeyword大神的Fragmentation,解决了各个场景下的 Fragment 问题,并添加了左滑退出等额外的支持,不可谓不强大,请收下我的膝盖。

    疑问二: 请正面回答疑问一,这个框架有什么不一样的地方吗?难道是老农民吗?重复造轮子闲的蛋疼?

    网上大多数的Fragment框架都是写了一个FragmentActivity父类,并添加了相应的方法支持,所以在使用那些框架的时候需要你的ActivityFragment继承他们框架提供的父类(不知怎么的,笔者对继承别人的父类老是有点排斥)。
    是啊,Fragment的很多操作都是生命周期相关的,所以不继承父类按理说是无法进行Fragment的管理的,但是FragmentRigger就是可以让你在集成的时候不需要继承任何类就可以对 Fragment 进行操作!!!(当然,你自己的父类还是要继承的= =)

    疑问三: 啥?不继承??那怎么使用???会不会更复杂?

    复杂??本框架的目的之一就是让 Fragment 的使用更加简单,好了,废话不 BB,还是来一行代码最省事。

    //在 Activity 中 add 并 show BFragment.
    @Puppet(containerViewId = R.id.container)
    public class AActivity extend AppcompatActivity{
        //触发显示操作
        Rigger.getRigger(this).startFragment(BFragment.newInstance());
    }
    

    没骗你吧,上述的代码有没继承,调用一行代码,成本只有一行注解就可以使用!!!

    疑问四: 代码这么少,也不继承,靠不靠谱啊?

    重温一下本框架的目的之一:让 Fragment 的使用更加简单,不继承是因为确实有很多人排斥使用第三方的父类,笔者也不例外,就算知道里面没什么要紧的事,但还是极度没有安全感,框架的原理是:使用 AOP 把Activity/Fragment的生命周期等方法定义为切点,插入到代理类中,一切操作都通过代理类来进行!!!

    演示

    本项目支持常见场景下的Fragment操纵方式,如有不支持的场景,欢迎提交Issues或者Email me

    栈管理

    懒加载

    同级显示

    目标

    • 让 Fragment 的使用更简单.
    • 以最低的成本去使用 Fragment.

    Wiki

    特性

    • [x] 超强大 Api 支持
    • [x] 足够多的英文注释
    • [x] 严格的异常抛出
    • [x] 解决 Fragment 中常见的异常及 Bug
    • [x] 事务提交永不丢失
    • [x] 扩展原生方法,添加onBackPressed等常见的方法支持
    • [x] 当前栈成员树状图打印
    • [x] Fragment 懒加载
    • [x] Fragment 转场动画
    • [ ] Fragment 间共享元素转场动画

    解决的问题

    • ~~Fragment 界面重叠~~
    • ~~Fragment 多级嵌套~~
    • ~~Fragment 栈的管理问题~~
    • ~~Fragment 事务提交失败~~
    • ~~Activity 在非 onResume 状态下提交事务~~
    • ~~Fragment 事务提交不能立即执行导致两次提交事件冲突~~
    • ~~内存重启时的一系列异常~~
    • ~~屏幕翻转时的数据保存及恢复~~
    • ~~Can not perform this action after onSaveInstanceState~~
    • ~~在 ViewPager 中的懒加载及其他场景下的懒加载~~
    • ~~不同场景下转场动画不执行问题~~

    使用样例

    本框架提供了强大的 Api 支持。
    和已有的大部分Fragment框架不同,不需要继承任何父类,只需要添加一行注解即可。
    在操纵Fragment的时候只需要通过代理类来操作,本框架完全采用一种插入式 的方式来降低使用成本。

    1、声明为框架的支持类

    在需要使用本框架的Activity/Fragment上添加注解@Puppet即可。

    //MainActivity.java
    @Puppet(containerViewId = R.id.atyContent)//containerViewId 是你需要操纵的 Fragment 在 add 时候的 container view
    public class MainActivity extends AppCompatActivity
    
    //TestFragment.java
    @Puppet
    public class TestFragment extends Fragment
    

    2、使用框架操纵Fragment

    添加@Puppet注解之后,在使用框架提供的Fragment操纵的方法的时候通过代理类Rigger来操纵。

    @Puppet(containerViewId = R.id.atyContent)
    public class MainActivity extends AppCompatActivity{
      ...
      //add 并 show 一个 Fragment 并添加至栈中,此时添加的 Fragment 是在 @Puppet 中的 containerViewId 中的
       Rigger.getRigger(this).startFragment(TestFragment.newInstance());
    }
    
    11 条回复    2018-01-02 17:22:45 +08:00
    JustKiddingBaby
        1
    JustKiddingBaby  
    OP
       2018-01-02 10:04:28 +08:00
    希望可以和大佬们相互交流,不断完善这个框架,如果有什么意见或者建议,欢迎吐槽~
    fan123199
        2
    fan123199  
       2018-01-02 10:17:18 +08:00
    赞,文档很全很细致。一个问题,懒加载的 lifecycle 是怎样的,点到该页面执行 lazyoncreate,那 oncreate 呢? oncreateview 呢?
    JustKiddingBaby
        3
    JustKiddingBaby  
    OP
       2018-01-02 10:30:10 +08:00
    @fan123199 其他生命周期正常执行,提供了额外的懒加载生命周期方法 onLazyLoadViewCreated(Bundle),这个方法可以保证在 ViewPager 等场景中只有在 Fragment 显示的时候调用一次,再次显示不调用。
    本框架的懒加载是针对 ViewPager 中的预加载实现的,并且模仿 ViewPager 中的预加载机制实现了本框架 show 场景下的懒加载支持。
    生命周期:
    ...
    onViewCreated
    setUserVisibleHint
    onLazyLoadViewCreated
    ...
    ChenSir
        4
    ChenSir  
       2018-01-02 10:41:39 +08:00
    前排。Star 一波再说
    JustKiddingBaby
        5
    JustKiddingBaby  
    OP
       2018-01-02 10:43:48 +08:00
    @ChenSir 谢谢大佬~
    lovefantasy
        6
    lovefantasy  
       2018-01-02 10:52:43 +08:00 via Android
    大佬好
    JustKiddingBaby
        7
    JustKiddingBaby  
    OP
       2018-01-02 11:09:28 +08:00
    @lovefantasy 大佬客气了。
    jerry12547
        8
    jerry12547  
       2018-01-02 15:54:30 +08:00
    大佬的文章在掘金看到过了。star 过了。还没细细品读
    JustKiddingBaby
        9
    JustKiddingBaby  
    OP
       2018-01-02 16:42:10 +08:00
    @jerry12547 谢谢支持~
    jerry12547
        10
    jerry12547  
       2018-01-02 17:07:43 +08:00
    @JustKiddingBaby 大佬你的 blog 内容好少呀
    JustKiddingBaby
        11
    JustKiddingBaby  
    OP
       2018-01-02 17:22:45 +08:00
    @jerry12547 咳,忽略,写博客太费时间了,没好好维护博客,也没什么有价值的文章,今年好好维护一下~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1146 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:39 · PVG 02:39 · LAX 10:39 · JFK 13:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.