Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Fragmento ViewState restaurado en onStart?

Cuando cambia la orientación, fragmento viewState restaurado sólo en onStart . Después onAttach , onCreateView , onViewCreated y onActivityCreated e incluso después onCreate . ¿Por qué? Esto es demasiado tarde.

Necesito poblar resultados de la pregunta del db a ListView basado en un cierto valor de TextView. Actualmente intento hacer esto en onViewCreated . Pero el estado de vista no se restaura en este paso.

¿Puedo forzar la restauración temprano? ¿O cómo superar este problema? Cualquier idea, por favor.

PS: Uso de la biblioteca de actionbarsherlock y android dependiente-v4 r7

PS2: si voy a cargar datos en onStart entonces hará consultas adicionales cuando el fragmento se reanuda después de onStop (puedo solucionar esto añadiendo algunos boolean isLoaded – pero esto no es la mejor solución).

3 Solutions collect form web for “Fragmento ViewState restaurado en onStart?”

En la API de Android> = 17 (Android 4.2 Jelly Beans) hay un método: public void onViewStateRestored (Bundle savedInstanceState)

Que se llama antes onStart() y después de onActivityCreated() como se menciona en documentos .

En la API de Android <17 no existe tal método. Pero hay dos soluciones:

  1. No confíe en el estado de vista al inicializar Fragment y guarde todo el estado de inicialización requerido como estado de Fragment (es decir Fragment#onSaveInstanceState() ). Posteriormente puede restaurar el estado de fragmento en onCreate() , onCreateView() o onViewCreated() .
  2. Realice la inicialización en onStart() como se especifica en la pregunta.

[EDIT 1 – – – – – – -]

// Compruebe si la pila trasera del fragmento se ha rellenado

// Si no, cree y rellene el diseño.

// así que tu fragmento no se recreará

  YourFragment yourFragment = (YourFragment )fm.findFragmentById(R.id.fragment_container); if (yourFragment == null) { FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.fragment_container, new YourFragment ()); ft.commit(); } 

[EDIT 1 – – – – – – -]

Introduzca aquí la descripción de la imagen

 /** * Listing 4-4: Fragment skeleton code * Listing 4-5: Fragment lifecycle event handlers */ package com.paad.fragments; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class MySkeletonFragment extends Fragment { // Called when the Fragment is attached to its parent Activity. @Override public void onAttach(Activity activity) { super.onAttach(activity); // Get a reference to the parent Activity. } // Called to do the initial creation of the Fragment. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Initialize the Fragment. } // Called once the Fragment has been created in order for it to // create its user interface. @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Create, or inflate the Fragment's UI, and return it. // If this Fragment has no UI then return null. return inflater.inflate(R.layout.my_fragment, container, false); } // Called once the parent Activity and the Fragment's UI have // been created. @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Complete the Fragment initialization Ğ particularly anything // that requires the parent Activity to be initialized or the // Fragment's view to be fully inflated. } // Called at the start of the visible lifetime. @Override public void onStart(){ super.onStart(); // Apply any required UI change now that the Fragment is visible. } // Called at the start of the active lifetime. @Override public void onResume(){ super.onResume(); // Resume any paused UI updates, threads, or processes required // by the Fragment but suspended when it became inactive. } // Called at the end of the active lifetime. @Override public void onPause(){ // Suspend UI updates, threads, or CPU intensive processes // that don't need to be updated when the Activity isn't // the active foreground activity. // Persist all edits or state changes // as after this call the process is likely to be killed. super.onPause(); } // Called to save UI state changes at the // end of the active lifecycle. @Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save UI state changes to the savedInstanceState. // This bundle will be passed to onCreate, onCreateView, and // onCreateView if the parent Activity is killed and restarted. super.onSaveInstanceState(savedInstanceState); } // Called at the end of the visible lifetime. @Override public void onStop(){ // Suspend remaining UI updates, threads, or processing // that aren't required when the Fragment isn't visible. super.onStop(); } // Called when the Fragment's View has been detached. @Override public void onDestroyView() { // Clean up resources related to the View. super.onDestroyView(); } // Called at the end of the full lifetime. @Override public void onDestroy(){ // Clean up any resources including ending threads, // closing database connections etc. super.onDestroy(); } // Called when the Fragment has been detached from its parent Activity. @Override public void onDetach() { super.onDetach(); } } 

Fuente: Professional Android Development 4 – Reto Meier

Siempre puede manejar cambios de orientación con onConfigurationChanged() . Ver un buen ejemplo aquí http://alexfu.tumblr.com/post/13926762386/android-dev-handling-fragment-recreation-manually

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.