MvxDialogFragment没有在Android 5 Lollipop下显示

时间:2014-11-28 15:35:54

标签: xamarin xamarin.android mvvmcross android-5.0-lollipop android-dialogfragment

在我们的mvvm应用程序中,我们使用的是mvxdialogfragments。在Android 4.4下一切正常,但完全相同的代码不适用于版本5棒棒糖。没有错误,没有例外等,他们只是没有出现:(

Dialog是从包含这些行的片段启动的:

          var myDialog = new CalendarPickerView(){ViewModel = new CalendarPickerViewModel(){CurrentMonth = ViewModel.Day}};
          myDialog.Show(Activity.SupportFragmentManager, "Date Selector");

这发生在对话框create-method:

public override Dialog OnCreateDialog(Bundle savedState)
{
        _singleLock = true;
        ViewModel = MyViewModel;
        EnsureBindingContextSet(savedState);

        View view = this.BindingInflate(Resource.Layout.CalendarPickerView, null);

        var myDialog = new Dialog(Activity, Resource.Style.CustomDialog);
        myDialog.SetContentView(view);

        MyViewModel.CurrentDate = DateTime.Now.Date;

        var leftButton = view.FindViewById<ImageView>(Resource.Id.btn_left);
        leftButton.Click += (sender, args) => MyViewModel.MonthBack();
        var rightButton = view.FindViewById<ImageView>(Resource.Id.btn_right);
        rightButton.Click += (sender, args) => MyViewModel.MonthForward();

        cal = view.FindViewById<GridView>(Resource.Id.calendarGrid);
        adapt = new CalendarAdapter(Activity);

        cal.ItemClick += cal_ItemClick;
        adapt.ViewModel = MyViewModel;
        MyViewModel.PropertyChanged += MyViewModel_PropertyChanged;
        cal.Adapter = adapt;

        var saveBtn = view.FindViewById<LinearLayout>(Resource.Id.area_Save);
        saveBtn.Click += ((s, a) =>
        {
            _singleLock = false;
            Activity.RequestedOrientation = ScreenOrientation.Sensor;
            Dismiss();
        });

        var abortBtn = view.FindViewById<LinearLayout>(Resource.Id.area_Cancel);
        abortBtn.Click += ((s, a) =>
        {
            _singleLock = false;
            Activity.RequestedOrientation = ScreenOrientation.Sensor;
            Dismiss();
        });

        myDialog.SetCancelable(false);
        myDialog.SetCanceledOnTouchOutside(false);

        return myDialog;
    }

如果我使用DialogFragment代替MvxDialogFragment作为CalendarPickerView的基类并删除create-method中所有与mvvm相关的代码,那么一切正常......

奇怪的是,在调试CalendarPickerView时,片段列在FragmentManager.Fragments下,但Dialog.IsShowing为false。 mvvm和xamarin都是28.11.2014最新的稳定版本。是否有其他人遇到过这个问题,或者你知道我们能做些什么吗?

提前感谢!

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,对我来说,问题不是使用MvvmCross或MvxDialogFragment。在我原来的以及单独的测试项目中,我发现了以下问题的原因:

似乎 - 我知道这听起来很荒谬 - 覆盖DialogFragment的OnStart()方法,即使只包含base.OnStart()调用的主体也会阻止对话框出现。看看你是在DialogFragment中还是在继承层次结构中的某个地方使用OnStart()。

顺便说一句,我想这不一定与Android 5 / Lollipop有关,但它与ART运行时有关。一旦我开始使用不使用ART运行时的Android 5设备,我会尝试确认这一点。

我已在此处上传了示例项目,可用于重现该问题:

https://github.com/nextmunich/XamarinDialogFragmentTest