近期开源了一个基于 AOP 的 Fragment 管理框架FragmentRigger。
目的有两点:
- 使用成本最低的 Fragment 框架。
- 让 Fragment 的使用更简单。
这不是重复造轮子
疑问一: 你可能会问了,网上关于 Fragment 的框架不是一抓一大把,为什么还要重复造轮子呢?
是的,关于Fragment的框架在网上是比较多的,如比较出名的YoKeyword大神的Fragmentation,解决了各个场景下的 Fragment 问题,并添加了左滑退出等额外的支持,不可谓不强大,请收下我的膝盖。
疑问二: 请正面回答疑问一,这个框架有什么不一样的地方吗?难道是老农民吗?重复造轮子闲的蛋疼?
网上大多数的Fragment框架都是写了一个Fragment和Activity父类,并添加了相应的方法支持,所以在使用那些框架的时候需要你的Activity和Fragment继承他们框架提供的父类(不知怎么的,笔者对继承别人的父类老是有点排斥)。
是啊,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 的使用更简单.
- 以最低的成本去使用 Fragment.
Wiki
- 安装
- 开始使用
- [Fragment 的操纵]( https://github.com/JustKiddingBaby/FragmentRigger/wiki/Fragment 的操纵)
- 懒加载
- 转场动画
- [onBackPressed 拦截]( https://github.com/JustKiddingBaby/FragmentRigger/wiki/onBackPressed 拦截)
- [startFragmentForResult 方法]( https://github.com/JustKiddingBaby/FragmentRigger/wiki/startFragmentForResult 方法)
- [如何在 library module 中使用]( https://github.com/JustKiddingBaby/FragmentRigger/wiki/如何在 library-module 中使用)
- 代码混淆
- 版本日志
特性
- [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());
}