13

Soy nuevo en Android y me enfrenta el siguiente problema. Estoy desarrollando para ambos, Android 2 y 3, y esta es la razón por la que uso fragmentos. Sin embargo, para que la aplicación funcione en dispositivos Android 2, importo android.support.v4.app.ListFragment. Necesito mantener la selección dentro de mi ListFragment cuando cambie la orientación de la pantalla. Estoy anulando el método onSaveInstanceState() y puse un int en el paquete. Cuando se gira la pantalla, se llama a este método y el int se agrega al paquete. Sin embargo, cuando se llama al onActivityCreated(), su paquete es nulo. Estoy siguiendo el ejemplo proporcionado en el sitio web de Android: http://developer.android.com/reference/android/app/Fragment.html, pero como se mencionó anteriormente, después de llamar al onSaveInstanceState(), el paquete en onActivityCreated() sigue siendo nulo.Android ListFragment no guarda el paquete en onSaveInstanceState()/no recupera el paquete en onActivityCreated()

Aquí está el código:

import android.support.v4.app.ListFragment; 
public class VisitsHomeFragment extends ListFragment { 
    private int selectedPosition = -1; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (savedInstanceState != null) { 
      if (savedInstanceState.containsKey("SELECTED_POSITION")) { 
       selectedPosition = savedInstanceState.getInt("SELECTED_POSITION"); 
      } 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("SELECTED_POSITION", selectedPosition); 
    } 
} 

Le agradecería cualquier ayuda con este problema.

+0

onRestoreInstanceState() no está disponible para fragmentos. – Maria

+0

Mi único sugerencia es depurar las fuentes de compatibilidad para ver si puede hacerse cargo de lo que está sucediendo. – PJL

+0

Jugué con el proyecto de muestra (HoneycombGallery), le agregué la Biblioteca de compatibilidad y todo funcionó bien ... En mi aplicación, no es así. La solución temporal para mí fue agregar 'android: configChanges =" orientation "' al Manifiesto, pero no resuelve el misterio del paquete perdido (en realidad pensando en escribir un libro de aventura titulado "El misterio del paquete perdido"). ;-)). – Maria

Respuesta

2

Tuve el mismo problema, y ​​eventualmente lo rastreé hasta tener diferentes valores de atributos android: id en los elementos de los fragmentos en los dos diseños diferentes (vertical y horizontal).

+0

Hola, gracias por tu respuesta. Desafortunadamente no es el mismo problema en mi caso. – Maria

7

Tuve el mismo problema, agregando android:id al elemento de fragmento en el archivo de diseño solucionado este problema.

Parece que FragmentManager usa la identificación para enviar el paquete apropiado al volver a crear un fragmento.

+0

Tengo el mismo problema que Maria, y tengo 'android: id' definido para el elemento' fragment' en mi archivo de diseño. Esto podría ser un error de biblioteca de compatibilidad. –

+0

Para mí, el problema estaba en android: id gracias – endryha

3

Asegúrese de no llamar al setRetainInstance(true) en el Fragment. Después de un poco de experimentación, identifiqué esto como el error en mi código. La desventaja de tener que hacerlo de esta manera es que uno tiene que agrupar manualmente todos los datos de instancia.

Después de eliminar la llamada al método y actualizar mi onSaveInstanceState para parcelar todas mis variables de instancia, ahora puedo restaurar la posición de la lista al girar.

+0

Si establecesRetainInstance (verdadero), entonces no necesitas un paquete en absoluto ... El objeto Fragment nunca se destruye y todas sus variables permanecen iguales. – Monstieur

Cuestiones relacionadas