使用接口优雅的监听Fragment中的返回键

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.csdn.net/postedit/40507387

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值