You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:36:03