前言
在单个Activity+多个Fragment架构设计中,通常会遇到点击手机物理按键返回上一层页面的场景,如果Activity中添加了Fragment,不管你加了几个,点击物理返回按钮时都会触发Activity的onBackPressed事件,直接返回到上一个Activity或者手机桌面,有时候往往需要Fragment能像Activity一样返回上一个Fragment即可,这样的需求就需要在Fragment中单独处理。
定义扩展函数
typealias OnBackPressedTypeAlias = () -> Unit
/**
* 解决 Fragment 中 OnBackPressed 事件, 默认结束当前Fragment依附的Activity
* @param type true:结束当前Activity,false:响应callback回调
*/
fun Fragment.setOnHandleBackPressed(type: Boolean = true, callback: OnBackPressedTypeAlias? = null) {
requireActivity().onBackPressedDispatcher.addCallback(this, object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (type) {
requireActivity().finish()
} else {
callback?.invoke()
}
}
})
}
使用
通过调用kotlin的扩展函数使用非常方便,在Fragment中的onCreate方法中使用如下:
- 默认返回
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setOnHandleBackPressed()
}
- 如果需要在返回时做出相应处理
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handlerBackPressedDispatcher()
}
private fun handlerBackPressedDispatcher(){
setOnHandleBackPressed(false) {
// 在Fragment中点击物理返回按钮,回退到手机桌面。
startActivity(Intent(Intent.ACTION_MAIN).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
addCategory(Intent.CATEGORY_HOME)
})
}
}
在Fragment中处理onBackPressed事件的方式有很多种,比如在基类Activity中的onBackPressed方法中调用基类Fragment中的方法,从而达到点击物理返回按钮做出响应,或者让Activity与Fragment使用一个ViewModel,在ViewModel中做处理,这几种方式也可实现,不过个人觉得使用这种kotlin扩展方便又灵活,推荐使用这种方式。