Android アプリの作成に MvvmCross を使用していますが、次の問題に直面しました。
ViewModel で作成した AlertDialog を表示しようとすると、
「Unhandled Exception: Android.Views.WindowManagerBadTokenException」が表示されます。
public class MyViewModel : MvxViewModel
{
public ICommand ShowAlertCommand { get; private set; }
public AuthorizationViewModel()
{
ShowAlertCommand = new MvxCommand(() =>
{
var adb = new AlertDialog.Builder(Application.Context);
adb.SetTitle("Title here");
adb.SetMessage("Message here");
adb.SetIcon(Resource.Drawable.Icon);
adb.SetPositiveButton("OK", (sender, args) => { /* some logic */});
adb.SetNegativeButton("Cancel", (sender, args) => { /* close alertDialog */});
adb.Create().Show();
});
}
}
私が調査していたとき、アラートダイアログ.ビルダーのアクティビティではなく、コンテキストへの参照の送信が原因であることがわかりました。
このトピックでは、次の決定を見つけました: GetService() を使用して現在のアクティビティへの参照を受け取りますが、IMvxServiceConsumer、IMvxAndroidCurrentTopActivity インターフェイスで動作する mvvmcross プラグインが見つかりませんでした。
私の質問は、ViewModel から AlertDialog を表示できますか? また、Application.Context ではなく Activity への参照を取得するにはどうすればよいですか? そして、ユーザーが現在のビューにとどまるという AlertDialog を閉じる正しい方法は何ですか?