Fragment中监听返回键
一、先定义一个接口
interface OnBackListener {
fun onBack(baseFragment BaseFragment)
// baseFragment 是基类Fragment
}
二、基类Fragment中
class BaseFragment() : Fragment() {
protected lateinit var onBackListener: OnBackListener
...
// 定义一个 open 方法, 类似模拟 activity 中的 onkeydown
open abstract fun onBackPress(): Boolean {
// 默认返回 false , 即在 fragment 中不消费返回键
return false
}
...
// 重写 onAttach
override fun onAttach(context: Context) {
super.onAttach(context)
try {
onBackListener = context as OnBackListener
} catch (e: ClassCastException) {
throw ClassCastException("必须实现CategoryFragment中的接口")
}
}
override fun onStart() {
super.onStart()
onBackListener.onBack(this)
}
}
三、FragmentContainer(Fragment的容器)中实现接口
class ContainerActivity() : AppCompatActivity(), OnBackListener {
private lateinit var baseFragment: BaseFragment
// 实现接口
override fun onBack(baseFragment: BaseFragment) {
this.baseFragment = baseFragment
}
...
/*
* 利用 if 进行判断
*
* 当 baseFragment.onBackPress() 返回的是 true 时,
* 说明有 fragment 重写了 onBackPress(), 那么就对返回键进行拦截
*
* 否则就继续执行 super.onKeyDown(keyCode, event)
* */
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (baseFragment.onBackPress()) return true
return super.onKeyDown(keyCode, event)
}
四、需要监听拦截返回键的Fragment
class TestFragment : BaseFragment() {
// 重写方法并设置监听内容
override fun onFragmentKeyDown(): Boolean {
Toast.makeText(requireContext(), "TestFragment", Toast.LENGTH_SHORT).show()
return true
}
}
学习笔记,感谢作者的分享
参考资料:http://write.blog.youkuaiyun.com/postedit/40507387