最近试单列activity设计模式,有一个需求就是要求fragment a跳到fragment b,然后在b处理完数据后,吧数据拿回afragment显示
大体是这样,正常人肯定会想,直接fragment间传递参数,不就完事了,多简单?但我是啥?我不是正常人,我要霍霍它,所以我想将fragment a的生命周期棒一个在activity中,然后在fragmentb中如果需要的话,从activity中拿就行了,因为想进入b,必须先通过a,所以理论上来讲不需要担心空指针异常问题,上代码
在baseFragment中添加
// 保存生命周期,以便后用
public fun setFragmentLife() {
if (requireActivity() is BaseActivity) {
(requireActivity() as BaseActivity).fragmentLife = this
}
}
// 将上次保存的fragment生命周期拿过去
public fun getSaveFragmentLife(): ViewModelStoreOwner? {
if (requireActivity() is BaseActivity) {
return if ((requireActivity() as BaseActivity).fragmentLife != null) {
(requireActivity() as BaseActivity).fragmentLife
} else {
this
}
}
return this
}
override fun onDestroy() {
super.onDestroy()
//把暂时保存的生命周期给清理掉
val a = requireActivity()
if (a != null && a is BaseActivity) {
//直接判断是不是就行,如果a.fragmentlife为null这个判断不会报错,会返回false
if (a.fragmentLife == this) {
a.fragmentLife = null
}
}
}
在baseactivity中添加
public var fragmentLife: ViewModelStoreOwner? = null
当需要用到时,fragment a中添加:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentLife()
}
然后在fragment a和b中需要用到viewmodel的地方,都使用
var viewmodel=ViewModelProvider(getSaveFragmentLife()!!, ViewModelProvider.NewInstanceFactory()).get(
{你的viewmodel}::class.java
)
另外,对于activity内存被挤爆自杀时,也不保存的这个生命周期丢失,我在我的手机上试了似乎可行,如果有bug可以评论区里讨论一下