web-dev-qa-db-fra.com

Jeton de fenêtre incorrect, vous ne pouvez pas afficher de boîte de dialogue avant la création d'une activité ou après son masquage

J'utilise une bibliothèque AppIntro dans mon application.

Il a 3 diapositives. Je veux demander quelque chose à l'utilisateur lorsque la troisième diapositive est affichée. Pour y parvenir, j'utilise dialogues matériels par afollestad .

Mon code dans l'activité AppIntro ressemble à ça:

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

En exécutant l'application, j'obtiens le problème suivant lorsque je passe à la troisième diapositive:

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)

Je ne comprends pas vraiment le problème. Parce que l'activité AppIntro est déjà chargée et je m'attends à ce qu'elle affiche une boîte de dialogue lorsqu'un fragment spécifique est affiché.

Comment puis-je réaliser pour afficher une boîte de dialogue lorsqu'une diapositive spécifique est affichée?

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

Je suppose que vous devez passer l'instance Activity ici, pas le contexte de l'application.

53
aga

Cela peut être résolu en confirmant que le courant ActivityhasWindowFocus parce que lorsque vous obtenez le contexte dans le fragment, au lieu de quelle activité il s'agit, il peut ne pas avoir windowFocus:

if (((Activity) mContext).hasWindowFocus()) {
        mDialog.show();
}
12
blueware

utilisation

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

n'utilisez pas getApplicationContext ().

8
Rashid

Utilisez "ceci" au lieu de "getApplicationContext ()" si cette erreur se produit même à l'intérieur de l'activité.

    mProgress = new MaterialDialog.Builder(this)
4
Muneef M
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();
            }
        });
    }
}

Voici ce que j'utilise en ce moment, et ça marche

J'espère que cela aide :)

1
Anonymous-E