这样设计 Fragment 你有什么看法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JustKiddingBaby
V2EX    Android

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

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

    近期开源了一个基于 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     Solana     5281 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 08:13 PVG 16:13 LAX 00:13 JFK 03:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86