2012-06-15 3 views
10

ich eine Aktivität haben, die eine Begrüßungsnachricht zeigt an, ob zum ersten Mal gestartet:ProgressDialog und Alertdialog Ursache durchgesickert Fenster

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    showWelcomeMessageIfNecessary(); 
} 

private void showWelcomeMessageIfNecessary() { 
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final Editor edit = prefs.edit(); 

    if (!prefs.getBoolean("welcomemessage", false)) { 
     edit.putBoolean("welcomemessage", true); 
     edit.commit(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.messages_welcome_content).setCancelable(false).setPositiveButton(R.string.errors_ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       // Do nothing 
      } 
     }).setTitle(R.string.messages_welcome_title); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
} 

Das alles schön funktioniert, aber wenn ich die App starten und sofort auf den Bildschirm drehen, Ich bekomme die bekannte Leck-Fenster-Ausnahme.

Wie würde ich das verhindern? Gibt es eine bessere Möglichkeit, Dialoge anzuzeigen? Dies passiert auch, wenn ich ProgressDialog s in AsyncTask s in Fragment s verwende.

+0

sein können 'neuer AlertDialog.Builder (this.getParent());' nicht sicher –

Antwort

18

Sie benötigen Dialog in OnStop oder onDestroy Aktivität Verfahren abzubrechen. Zum Beispiel:

private AlertDialog diag = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    diag = showWelcomeMessageIfNecessary(); 

    if(diag != null) 
     diag.show(); 
} 

private AlertDialog showWelcomeMessageIfNecessary() { 
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final Editor edit = prefs.edit(); 
    AlertDialog alert = null; 

    if (!prefs.getBoolean("welcomemessage", false)) { 
     edit.putBoolean("welcomemessage", true); 
     edit.commit(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.messages_welcome_content).setCancelable(false).setPositiveButton(R.string.errors_ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       // Do nothing 
      } 
     }).setTitle(R.string.messages_welcome_title); 
     alert = builder.create(); 
    } 

    return alert; 
} 


@Override 
protected void onStop() { 
    super.onStop(); 

    if(diag != null) 
     diag.dismiss(); 
} 
+0

Okay, das funktioniert. Ich denke, ich verstehe es jetzt. Wenn Sie den Dialog 'onStop()' nicht verwerfen, wird der Dialog immer noch angezeigt und an eine alte 'Aktivität' angehängt. Ein bisschen verwirrend, da die Ausnahme in der 'onShow()' Zeile auftrat, was mich zu der Annahme brachte, dass ich das Fenster durchsickerte, als * start * den Dialog zeigte. – nhaarman

+0

Ja, wenn ein Dialog für eine Aktivität auf "sichtbar" gesetzt ist, aber die Aktivität selbst zerstört wird, führt dies zu einem ausgelaufenen Fensterfehler – waqaslam