DialogFragment 返回键

本文介绍了如何在DialogFragment中阻止其随返回键关闭,通过重写DialogFragment的setCancelable方法,以及创建一个内部Dialog子类MyDialog来拦截并传递返回事件给Activity。
摘要由CSDN通过智能技术生成

在使用DialogFragment时有需求要DialogFragment在界面内一直展示,不能随返回键关闭,这时候就需要处理DialogFragment的返回事件: 在DialogFragment中使用setCancelable(false) 可以让DialogFragment不随返回键关闭,但这样处理又会导致返回事件被Dialog消化,无法传递到Activity,Activity无法关闭。

解决方法:

public void setCancelable(boolean cancelable) {

        mCancelable = cancelable;

        if (mDialog != null) mDialog.setCancelable(cancelable);

 }

这个是调用的DialogFragment中setCancelable方法,可以看到它里面也是对内部Dialog进行操作的,再看下Dialog内部怎么处理的

public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE) {

            event.startTracking();

            return true;

        }

        return false;

 }

public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) {

        if ((keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE)

                && event.isTracking()

                && !event.isCanceled()) {

            onBackPressed();

            return true;

        }

        return false;

}

public void onBackPressed() {

        if (mCancelable) {

            cancel();

        }

  }

重点是这几个方法,Dialog会在按下物理键的时候在onKeyDown中拦截返回事件,抬起时在onKeyUp方法中将事件传给onBackPressed处理

那就咱们就可以写一个Dialog子类,在子类中重写onKeyDown方法,拦截返回事件交给外部Activity处理

inner class MyDialog(mActivity: Activity, themeResId: Int) :Dialog(mActivity, themeResId) {

        init {

            setCanceledOnTouchOutside(false)

        }

        override fun onKeyDown(keyCode : Int , event : KeyEvent) : Boolean {

            if (keyCode == KeyEvent.KEYCODE_BACK) {

                (mActivity as MyActivity).onKeyDown(keyCode , event)

                return true

            }

            return super.onKeyDown(keyCode , event)

        }

    }

在DialogFragment中重写onCreateDialog方法

override fun onCreateDialog(savedInstanceState : Bundle?) : Dialog {

 return MyDialog(mActivity, theme)

}

这样就完美解决这个问题了!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值