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

2018-01-02 10:03:08 +08:00
 JustKiddingBaby

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

项目传送门

这不是重复造轮子

疑问一: 你可能会问了,网上关于 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());
}
5467 次点击
所在节点    Android
11 条回复
JustKiddingBaby
2018-01-02 10:04:28 +08:00
希望可以和大佬们相互交流,不断完善这个框架,如果有什么意见或者建议,欢迎吐槽~
fan123199
2018-01-02 10:17:18 +08:00
赞,文档很全很细致。一个问题,懒加载的 lifecycle 是怎样的,点到该页面执行 lazyoncreate,那 oncreate 呢? oncreateview 呢?
JustKiddingBaby
2018-01-02 10:30:10 +08:00
@fan123199 其他生命周期正常执行,提供了额外的懒加载生命周期方法 onLazyLoadViewCreated(Bundle),这个方法可以保证在 ViewPager 等场景中只有在 Fragment 显示的时候调用一次,再次显示不调用。
本框架的懒加载是针对 ViewPager 中的预加载实现的,并且模仿 ViewPager 中的预加载机制实现了本框架 show 场景下的懒加载支持。
生命周期:
...
onViewCreated
setUserVisibleHint
onLazyLoadViewCreated
...
ChenSir
2018-01-02 10:41:39 +08:00
前排。Star 一波再说
JustKiddingBaby
2018-01-02 10:43:48 +08:00
@ChenSir 谢谢大佬~
lovefantasy
2018-01-02 10:52:43 +08:00
大佬好
JustKiddingBaby
2018-01-02 11:09:28 +08:00
@lovefantasy 大佬客气了。
jerry12547
2018-01-02 15:54:30 +08:00
大佬的文章在掘金看到过了。star 过了。还没细细品读
JustKiddingBaby
2018-01-02 16:42:10 +08:00
@jerry12547 谢谢支持~
jerry12547
2018-01-02 17:07:43 +08:00
@JustKiddingBaby 大佬你的 blog 内容好少呀
JustKiddingBaby
2018-01-02 17:22:45 +08:00
@jerry12547 咳,忽略,写博客太费时间了,没好好维护博客,也没什么有价值的文章,今年好好维护一下~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419287

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX