18

Tengo una aplicación que utiliza fragmentos, todos los cuales están contenidos en una sola actividad. La actividad comienza con un fragmento que contiene un menú de botones, todos los cuales causan varios fragmentos de lista para reemplazar el botón original/fragmento de menú.Lista de mantenimiento en el fragmento de lista en el cambio de orientación

Mi problema es que en un cambio de orientación, si la actividad muestra una de las vistas de lista, desaparece y vuelve el menú del botón. Entiendo por qué sucede esto ... la actividad se destruye y vuelve a crear, pero no cómo evitarla y mantener la vista de lista/fragmento actual a través del cambio de orientación.

He encontrado setRetainInstance y el ejemplo de uso here, pero no puedo encontrar la manera de aplicarlo a mi situación con el menú de botones o la posibilidad de que el fragmento que deseo conservar sea uno de varios unos.

A continuación se muestra un código simplificado para mostrar la actividad principal y uno de los listfragments.

Cualquier puntero en qué agregar dónde hacerlo para que se conserve el fragmento de la lista sería muy apreciado.

Actividad

public class Main extends FragmentActivity { 
    private MainMenuFragment menu; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     menu = new MainMenuFragment(); 
     getSupportFragmentManager().beginTransaction().replace(R.id.pane, menu).commit();  
    } 
} 

ListFragment

public class ItemListFragment extends ListFragment { 

    private TextView header; 
    private TextView empty; 
    private Button add; 
    public static Cursor itemCursor; 
    private GroceryDB mDbHelper; 
    public static long mRowId; 
    public static CheckCursorAdapter lists; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.common_list, container, false); 
     header = (TextView) v.findViewById(R.id.header); 
     empty = (TextView) v.findViewById(android.R.id.empty); 
     header.setText(R.string.header_item); 
     empty.setText(R.string.empty_items); 
     return v; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     mRowId=0; 
     mDbHelper = new GroceryDB(getActivity()); 
     mDbHelper.open(); 

     itemCursor = mDbHelper.fetchAllItems(); 
     getActivity().startManagingCursor(itemCursor); 

     String[] from = new String[] { GroceryDB.ITEM_NAME }; 
     int[] to = new int[] { R.id.ListItem }; 
     lists = new CheckCursorAdapter(getActivity(), 
       R.layout.listlayout_itemlist, itemCursor, from, to); 
     setListAdapter(lists);   
    } 
} 

Respuesta

34

cómo trabajar alrededor de ella y mantener el fragmento de vista de lista/corriente a través del cambio de orientación

Estás reemplazando ciegamente el fragmento cada vez que se invoca onCreate(). En cambio, solo agregue/reemplace el fragmento si savedInstanceState() es null. Si no es null, regresa de un cambio de configuración y se volverán a crear los fragmentos existentes (o, si se conservaron, ya están allí).

setRetainInstance(true) significa que el fragmento será retenido a través de cambios en la configuración, en lugar de ser destruidos/recreado como la actividad es. Sin embargo, todavía se llamará con onCreateView(). En su código, eso significa que sus miembros de datos de ItemListFragment se quedarían, pero igual tendría que llamar al setListAdapter(), incluso si no necesita volver a consultar la base de datos.

+0

Bueno, eso fue increíblemente embarazoso (por no hablar de tonto de mí). Yo ** sé ** que debo verificar para savedInstanceState(), pero por alguna razón no lo hice esta vez y nunca lo pensé. Gracias por la rápida respuesta. – Barak

0

Sé que esto se ha resuelto hace mucho tiempo, pero por el bien de las personas que buscan una solución que tienen tantos problemas como he tenido (repetidamente) con la retención de listas durante un cambio de orientación, me gustaría agregue que también podría usar una clase personalizada que contenga la lista de datos para su adaptador de lista.

De esta forma mantiene los datos al volver a crear la actividad (y el fragmento de lista) y puede probar para ver si tiene algún dato en su creación en oncreate. Si el list == null o el list.size < 0 procede de la forma habitual y obtiene los datos de la forma en que normalmente lo obtiene. De lo contrario, simplemente configure su adaptador de datos con los datos que ya tiene.

Para mí, esto es mucho más fácil, y dado que Eclipse crea automáticamente una clase DummyContent similar para sus datos al crear un proyecto maestro/flujo de detalles de Android, básicamente solo requiere un cambio de la creación de sufragmentode lista.

Cuestiones relacionadas