Плохой оконный токен, вы не можете показать диалоговое окно перед созданием Activity или после его скрытия

Я использую AppIntro library в своем приложении.

Он имеет 3 слайда. Я хочу спросить пользователя, когда будет показан третий слайд. Чтобы добиться этого, я использую диалоговые окна материалов afollestad.

Мой код в AppIntro Activity выглядит так:

@Override
    public void onNextPressed() {
        if(this.pager.getCurrentItem() == 2) {
            MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
                    .title("QR Code scannen")
                    .content("Möchtest du den QR Code scannen oder selbst eingeben?")
                    .positiveText("eingeben")
                    .negativeText("scannen")
                    .onPositive(new MaterialDialog.SingleButtonCallback() {
                        @Override
                        public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                            Intent intent = new Intent(getApplicationContext(), RegistrationActivity.class);
                            startActivity(intent);
                        }
                    })
                    .onNegative(new MaterialDialog.SingleButtonCallback() {
                        @Override
                        public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                            // TODO
                        }
                    })
                    .show();
        }
    } 

Запуск приложения У меня возникает следующая проблема, когда я перехожу на третий слайд:

com.afollestad.materialdialogs.MaterialDialog$DialogException: 
Bad window token, you cannot show a dialog before an Activity is created or after it hidden.
at com.afollestad.materialdialogs.MaterialDialog.show(MaterialDialog.java:1328)
at com.afollestad.materialdialogs.MaterialDialog$Builder.show(MaterialDialog.java:1317)
at com.ads.adstimer.fragment.Registration.RegistrationActivity.onNextPressed(RegistrationActivity.java:64)
at com.github.paolorotolo.appintro.AppIntro$2.onClick(AppIntro.java:118)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Я действительно не понимаю эту проблему. Поскольку AppIntro Activity уже загружен, и я ожидаю, что он покажет диалог, когда будет показан конкретный фрагмент.

Как я могу показать диалог, когда отображается конкретный слайд?

+21
источник поделиться
4 ответа
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())

Я предполагаю, что вам нужно передать экземпляр Activity здесь, а не контекст приложения.

+38
источник

использование

 MaterialDialog dialog = new MaterialDialog.Builder(YourActivityName.class)

не использовать getApplicationContext().

+5
источник

Используйте "this" вместо "getApplicationContext()", если эта ошибка происходит даже внутри действия.

    mProgress = new MaterialDialog.Builder(this)
+4
источник

Это можно устранить, подтвердив, что текущий Activity hasWindowFocus, потому что, когда вы получаете контекст во фрагменте, а не в точности, какой из них есть, он может не иметь windowFocus:

if (((Activity) mContext).hasWindowFocus()) {
        mDialog.show();
}
+4
источник

Посмотрите другие вопросы по меткам или Задайте вопрос