Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bad window token, you cannot show a dialog before an Activity is created or after it's hidden

I am using an AppIntro library in my app.

It has 3 slides. I want to ask the user something when the third slide is shown. To achieve that I am using material dialogs by afollestad.

My code in the AppIntro Activity looks like that:

@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();
        }
    } 

Running the App I get the following issue when I slide to the third slide:

com.afollestad.materialdialogs.MaterialDialog$DialogException: 
Bad window token, you cannot show a dialog before an Activity is created or after it's 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)

I do not really understand the problem. Because the AppIntro Activity is already loaded and I expect it to show a dialog when a specific fragment is shown.

How can I achieve to show a dialog when a specific slide is shown?

like image 976
jublikon Avatar asked Dec 27 '15 14:12

jublikon


4 Answers

MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())

I suppose you need to pass the Activity instance here, not the application context.

like image 168
aga Avatar answered Nov 18 '22 21:11

aga


This can be resolved by confirming that current Activity hasWindowFocus because when you get the context in the fragment, instead of exactly which Activity it is, it might not have windowFocus :

if (((Activity) mContext).hasWindowFocus()) {
        mDialog.show();
}
like image 33
blueware Avatar answered Nov 18 '22 21:11

blueware


use

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

do not use getApplicationContext().

like image 10
Rashid Avatar answered Nov 18 '22 21:11

Rashid


Use "this" instead of "getApplicationContext()" if this error happening even inside the activity.

    mProgress = new MaterialDialog.Builder(this)
like image 5
Muneef M Avatar answered Nov 18 '22 22:11

Muneef M