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

谁都会走 提交于 2020-05-09 20:06:42

问题


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?


回答1:


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

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




回答2:


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



回答3:


use

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

do not use getApplicationContext().




回答4:


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

    mProgress = new MaterialDialog.Builder(this)



回答5:


public class MainActivity extend Activity{

    MaterialDialog dialog;

    protected void onCreate(Bundle savedInstanceState) {

        dialog =  new MaterialDialog.Builder(OrderInfoActivity.this)
                .title("Reject?")
                .content("Are you reject this order?")
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {
                        Toast.makeText(OrderInfoActivity.this, "Option1", Toast.LENGTH_SHORT).show();
                        }
                })
                .onNeutral(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {
                        Toast.makeText(OrderInfoActivity.this, "Option 2", Toast.LENGTH_SHORT).show();
                    }
                })
                .onNegative(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {
                        Toast.makeText(OrderInfoActivity.this, "Option 3", Toast.LENGTH_SHORT).show();
                    }
                }).build();

        accept.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                  dialog.show();
            }
        });
    }
}

Here is what i'm using right now, and it's working

Hope it helps :)



来源:https://stackoverflow.com/questions/34481525/bad-window-token-you-cannot-show-a-dialog-before-an-activity-is-created-or-afte

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!