I am having a problem with a ProgressDialog thing in MVVMCross.
I am getting Android.Views.WindowManagerBadTokenException
: while creating ProgressDialog
via IReportService
where I have context from setup.cs.
public class Setup
: MvxBaseAndroidBindingSetup
{
public Setup(Context applicationContext)
: base(applicationContext)
{
}
protected override MvxApplication CreateApp()
{
return new NoSplashScreenApp();
}
public class Converters
{
public readonly MvxVisibilityConverter Visibility = new MvxVisibilityConverter();
}
protected override IEnumerable<Type> ValueConverterHolders
{
get { return new[] {typeof (Converters)}; }
}
protected override void InitializeLastChance()
{
var errorHandler = new ReportsDisplayer(ApplicationContext);
base.InitializeLastChance();
}
}
public class ReportsDisplayer
: IMvxServiceConsumer<IReportsSource>
, IMvxServiceConsumer<IMvxAndroidCurrentTopActivity>
{
private readonly Context _applicationContext;
private ProgressDialog _progressDialog;
public ReportsDisplayer(Context applicationContext)
{
_applicationContext = applicationContext;
var source = this.GetService<IReportsSource>();
source.ErrorReported += (sender, args) => ShowError(args.Message);
source.MessageReported += (sender, args) => ShowMessage(args.Title, args.Message);
source.ProgressDialogShowed += (sender, args) => ShowProgressDialog(args.Title, args.Message);
source.ProgressDialogDismiss += (sender, args) => DismissProgressDialog();
}
private void ShowError(string message)
{
var activity = this.GetService<IMvxAndroidCurrentTopActivity>().Activity as IMvxBindingActivity;
View layoutView = activity.NonBindingInflate(Resource.Layout.ToastLayout_Error, null);
var text1 = layoutView.FindViewById<TextView>(Resource.Id.ErrorText1);
text1.Text = "Błąd";
var text2 = layoutView.FindViewById<TextView>(Resource.Id.ErrorText2);
text2.Text = message;
var toast = new Toast(_applicationContext);
toast.SetGravity(GravityFlags.CenterVertical, 0, 0);
toast.Duration = ToastLength.Long;
toast.View = layoutView;
toast.Show();
}
private void ShowMessage(string title, string message)
{
var activity = this.GetService<IMvxAndroidCurrentTopActivity>().Activity as IMvxBindingActivity;
View layoutView = activity.NonBindingInflate(Resource.Layout.ToastLayout_Message, null);
var text1 = layoutView.FindViewById<TextView>(Resource.Id.MessageText1);
text1.Text = title;
var text2 = layoutView.FindViewById<TextView>(Resource.Id.MessageText2);
text2.Text = message;
var toast = new Toast(_applicationContext);
toast.SetGravity(GravityFlags.CenterVertical, 0, 0);
toast.Duration = ToastLength.Long;
toast.View = layoutView;
toast.Show();
}
private void ShowProgressDialog(string title, string message)
{
_progressDialog = new ProgressDialog(_applicationContext);
_progressDialog .SetTitle(title);
_progressDialog .SetMessage(message);
_progressDialog .Show();
}
private void DismissProgressDialog()
{
_progressDialog .Dismiss();
}
}
ToastMessages
are working fine with using local context, but ProgressDialog
doesn't. The debugger crashes while running _progressBar.Show()
. I have searched all the internet but I can't find any solution. Any suggestions are more than welcome!
IMvxServiceConsumer<T> and GetService<T> were replaced with Mvx.Resolve<T> in v3
. – Uund