MvvmCross 8.0.2 Android端MvxDialogFragment按返回键无法关闭问题
问题根因
这个是MvvmCross 8.0版本重构Android模态导航逻辑时引入的Bug,并非有意设计。8.x版本默认将MvxDialogFragment的Cancelable属性设置为false,同时拦截了返回键事件的分发,导致原生的取消、关闭回调无法被触发,这也是你重写OnCancel/Dismiss等方法不生效的原因。
适配方案&Workaround
方案1:单对话框手动配置(适合少量对话框场景)
在你的MvxDialogFragment子类的OnCreateDialog方法中手动开启可取消属性即可:
public override Dialog OnCreateDialog(Bundle savedInstanceState) { var dialog = base.OnCreateDialog(savedInstanceState); // 允许返回键关闭 this.Cancelable = true; // 按需添加:允许点击对话框外部区域关闭 dialog.SetCanceledOnTouchOutside(true); return dialog; }
方案2:全局统一适配(适合全项目大量对话框场景)
自定义项目统一的基类MvxDialogFragment,在基类中统一配置属性,后续所有对话框都继承该基类即可:
public class BaseMvxDialogFragment<TViewModel> : MvxDialogFragment<TViewModel> where TViewModel : class, IMvxViewModel { public override Dialog OnCreateDialog(Bundle savedInstanceState) { var dialog = base.OnCreateDialog(savedInstanceState); this.Cancelable = true; dialog.SetCanceledOnTouchOutside(true); return dialog; } }
方案3:兜底拦截返回键(如果上述方案不生效时使用)
如果存在特殊场景配置Cancelable后仍然不生效,可以直接在OnCreateDialog中给Dialog设置按键监听器,主动拦截返回键事件执行关闭逻辑,注意需要同时调用ViewModel的Close方法同步MvvmCross导航栈状态:
public override Dialog OnCreateDialog(Bundle savedInstanceState) { var dialog = base.OnCreateDialog(savedInstanceState); this.Cancelable = true; dialog.SetOnKeyListener((d, keyCode, e) => { if (keyCode == Keycode.Back && e.Action == KeyEventActions.Up) { Dismiss(); ViewModel?.Close(); return true; } return false; }); return dialog; }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

