2012-06-15 11 views
10

trapelato ho un'attività che mostra un messaggio di benvenuto, se avviato per la prima volta:ProgressDialog e AlertDialog causa finestra

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

Tutto questo funziona benissimo, però quando inizio l'applicazione, e subito ruotare lo schermo, Ottengo l'eccezione della finestra trapelata ben nota.

Come evitarlo? C'è un modo migliore per mostrare i dialoghi? Questo accade anche quando uso ProgressDialog s in AsyncTask s in Fragment s.

+0

possono essere 'nuova AlertDialog.Builder (this.getParent());' non è sicuro –

risposta

18

è necessario annullare dialogo nel metodo onStop o OnDestroy di attività. Per esempio:

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

Va bene, questo funziona. Penso di averlo capito ora. Se non si chiude la finestra di dialogo 'onStop()', la finestra di dialogo è ancora mostrata, allegata a una vecchia 'Attività'. Un po 'di confusione come l'eccezione si è verificata nella riga 'onShow()', portandomi a pensare di aver perso la finestra quando * iniziando * per mostrare la finestra di dialogo. – nhaarman

+0

sì, quando una finestra di dialogo su un'attività è impostata su visibile ma in qualche modo l'attività stessa viene distrutta, quindi causa errore di finestra persa – waqaslam

Problemi correlati