2012-06-15 19 views
10

filtrado tengo una actividad que muestra un mensaje de bienvenida si comenzó por primera vez:ProgressDialog y AlertDialog causa ventana

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

Todo esto funciona muy bien, sin embargo cuando inicio la aplicación, e inmediatamente girar la pantalla, Obtengo la conocida excepción de ventana filtrada.

¿Cómo puedo evitar esto? ¿Hay una mejor manera de mostrar los diálogos? Esto también ocurre cuando uso ProgressDialog s en AsyncTask s en Fragment s.

+0

puede ser 'nueva AlertDialog.Builder (this.getParent());' no está seguro –

Respuesta

18

necesita cancelar diálogo en el método onStop o OnDestroy de actividad. Por ejemplo:

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

bien, esto funciona. Creo que lo entiendo ahora Si no cierra el cuadro de diálogo 'onStop()', el cuadro de diálogo sigue mostrándose, adjunto a una 'Actividad' anterior. Un poco confuso ya que la excepción ocurrió en la línea 'onShow()', lo que me llevó a pensar que había escapado la ventana cuando * comenzaba * a mostrar el diálogo. – nhaarman

+0

sí, cuando un diálogo en una actividad se establece en visible pero de alguna manera la actividad en sí misma se destruye, entonces causa un error de ventana filtrada – waqaslam