2015-12-27 36 views
21

Sto utilizzando un AppIntro library nella mia app.Token di finestra non valido, non è possibile visualizzare una finestra di dialogo prima che venga creata un'attività o dopo che è nascosta

Dispone di 3 diapositive. Voglio chiedere all'utente qualcosa quando viene mostrata la terza diapositiva. Per raggiungere questo sto usando material dialogs by afollestad.

Il mio codice nel AppIntro attività sembra che:

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

esecuzione App ottengo il seguente problema quando scivolo alla terza diapositiva:

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) 

io non capisco la problema. Poiché l'attività AppIntro è già stata caricata e mi aspetto che mostri una finestra di dialogo quando viene visualizzato un frammento specifico.

Come è possibile ottenere una finestra di dialogo quando viene visualizzata una diapositiva specifica?

+0

controllo http: // StackOverflow .com/a/2899630/2015538 – nbaroz

risposta

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

Suppongo che è necessario passare l'istanza Activity qui, non il contesto applicativo.

+5

Per i futuri lettori, utilizzare semplicemente questo 'YourActivityClassName.this' invece di' getApplicationContext() ' –

+1

Qual è la differenza? –

+1

Chi mantiene il contesto dell'interfaccia utente è Activity (tramite YourActivityClassName.this). GetApplicationContext() mantiene solo il contesto dell'applicazione. La finestra di dialogo richiede il contesto dell'interfaccia utente, quindi passiamo al contesto di attività. – Kharda

4

Utilizzare "this" anziché "getApplicationContext()" se questo errore si verifica anche all'interno dell'attività.

mProgress = new MaterialDialog.Builder(this) 
5

uso

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

non usano getApplicationContext().

+1

Questo è quello che ha funzionato per me, grazie! –

+2

Dovrebbe essere 'YourActivityClassName.this', o semplicemente' this', non '.class' –

4

Questo può essere risolto con la conferma che l'attuale ActivityhasWindowFocus perché quando si ottiene il contesto nel frammento, invece di esattamente quali attività è, potrebbe non avere windowFocus:

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