2015-12-27 3 views
21

Ich verwende eine AppIntro library in meiner App.Schlechte Fenster-Token, Sie können keinen Dialog anzeigen, bevor eine Aktivität erstellt oder nachdem sie ausgeblendet wird

Es hat 3 Dias. Ich möchte den Benutzer etwas fragen, wenn die dritte Folie angezeigt wird. Um das zu erreichen, verwende ich material dialogs by afollestad.

Mein Code in der AppIntro Aktivität sieht wie folgt aus:

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

Ausführen der App ich folgendes Problem, wenn ich mit dem dritten Schlitten gleiten:

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) 

Ich verstehe nicht wirklich die Problem. Da die AppIntro-Aktivität bereits geladen ist und ich erwarte, dass ein Dialog angezeigt wird, wenn ein bestimmtes Fragment angezeigt wird.

Wie kann ich erreichen, dass ein Dialogfeld angezeigt wird, wenn eine bestimmte Folie angezeigt wird?

+0

Check http: // Stackoverflow .com/a/2899630/2015538 – nbaroz

Antwort

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

Ich nehme an, Sie müssen hier die Activity Beispiel passieren, nicht den Anwendungskontext.

+5

Für zukünftige Leser, verwenden Sie einfach diesen 'YourActivityClassName.this' anstelle von 'getApplicationContext()' –

+1

Was ist der Unterschied? –

+1

Derjenige, der den Kontext der Benutzeroberfläche behält, ist Aktivität (über YourActivityClassName.this). Der getApplicationContext() behält nur den Kontext der Anwendung. Der Dialog benötigt den UI-Kontext, daher übergeben wir den Aktivitätskontext. – Kharda

4

Verwenden Sie "dies" anstelle von "getApplicationContext()", wenn dieser Fehler auch innerhalb der Aktivität auftritt.

mProgress = new MaterialDialog.Builder(this) 
5

Verwendung

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

nicht getApplicationContext (verwenden).

+1

Das hat bei mir funktioniert, danke! –

+2

Es sollte 'YourActivityClassName.this' sein, oder einfach' this', nicht '.class' –

4

Dies kann durch die Bestätigung, dass die derzeitigen ActivityhasWindowFocus gelöst werden, denn wenn man den Kontext, in dem Fragmente erhalten, anstatt genau von welcher Aktivität es ist, es nicht windowFocus haben könnte:

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