2012-07-03 19 views
21

Tengo una aplicación de ejemplo "hello world" -ish que utiliza la API android-support-v4 fragments. La actividad consiste en un botón, al hacer clic se mostrará un DialogFragment. Sin embargo, los cambios de configuración como la rotación hacen que el diálogo desaparezca, incluso si se usa setRetainInstance (verdadero).DialogFragment desaparece al girar a pesar de setRetainInstance (verdadero)

alguna idea de cómo solucionar este problema?

RetFragment.java

package me.local.HelloFroyo; 

import android.os.Bundle; 
import android.support.v4.app.*; 
import android.util.Log; 
import android.view.*; 

public class RetFragment extends DialogFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.hello_dialog_fragment, container); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.e("RET", "onDestroy"); 
    } 
} 

MainActivity.java

package me.local.HelloFroyo; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.View; 

public class MainActivity extends FragmentActivity { 

    private static final String TAG_DLG = "myFragDlg"; 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.activity_main); 
    } 

    public void onShowClick(View v) { 
     RetFragment ret = new RetFragment(); 
     ret.show(getSupportFragmentManager(), TAG_DLG); 
    } 
} 

Respuesta

28

Sólo para comentar sobre esto:

"incluso si se utiliza setRetainInstance (verdadero)"

No es "incluso si", es "por eso". Si setRetainInstance es falso, el diálogo se gira muy bien.

Este es el trabajo en torno a que encontré aquí, que funciona bien para mí: http://code.google.com/p/android/issues/detail?id=17423

@Override 
public void onDestroyView() 
{ 
    Dialog dialog = getDialog(); 

    // Work around bug: http://code.google.com/p/android/issues/detail?id=17423 
    if ((dialog != null) && getRetainInstance()) 
     dialog.setDismissMessage(null); 

    super.onDestroyView(); 
} 
+7

Esto no parece funcionar para mí-- el diálogo aún se descarta. – ch3rryc0ke

+0

@ ch3rryc0ke encontraste algún solución a esto, tengo el mismo problema. He implementado el código anterior, pero el diálogo aún se descarta – drisse

+0

No estoy seguro acerca de la solución aquí, pero tienes razón en que no deberías usar 'setRetainInstance' en este caso .Si hay un estado que desea persistir, use el 'savedInstanceState' o' arguments' 'Bundle'. Hay un [buen ejemplo] (http://developer.android.com/reference/android/app/DialogFragme nt.html # AlertDialog) en los documentos de Android sobre la mejor manera de usar 'DialogFragment' para generar' AlertDialog's. – jsadler

-11

intenta agregar

android:configChanges="orientation" 

en el archivo AndroidManifest Againt su actividad.

+1

No quiero evitar que toda la actividad sea destruida y recreada, solo quiero mantener el DialogFragment. – user1324237

+0

Esto no creará su actividad nuevamente. permanecerá en el mismo estado si agrega esto a su actividad. Sin esta afirmación, tu actividad crea cada vez que cambias tu orientación. –

+0

Lo sé, pero solo quiero conservar el _dialog fragment_. Se supone que la actividad debe ser destruida y recreada. ¿Estás familiarizado con el fragmento API? – user1324237

4

DialogFragments sobrevivir a los cambios de rotación sobre sí mismos, u no necesita setRetainInstance

Sin embargo, si u Colocar en ella, este es un error reproducible con setRetainInstance (verdadero) y DialogFragments

http://code.google.com/p/android/issues/detail?id=17423&q=setRetaininstance&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

simplemente no setRetainInstance, el diálogo funcionará bien

Sin embargo, si usted tiene una AsyncTask corriendo a lo largo de su DialogFragment y quiere persistir él uso LoaderManager con AsyncTaskLoader .. también sobrevive a los cambios de configuración

1

Para quienes tener problemas incluso después de setRetainInstance(true) o sobrescribir onDestroyView y todavía no funciona, asegúrese de llamar a la super.onSaveInstanceState() al sobrescribir onSaveInstanceState:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); // <-- must call this if you want to retain dialogFragment upon rotation 
    ... 
} 

el dialogFragment debe manejar la recreación de diálogo en sí en rotación incluso sin setRetainInstance o sobreescritura en DestroyView.

+0

¡Eso me sirvió! +1 –

Cuestiones relacionadas