tutorial studio sirven que para navegar los fragments example entre eliminar destruir backstack abrir android acl fragment android-support-library android-compatibility

android - studio - Cómo determinar el fragmento restaurado desde backstack



navegar entre fragments android studio (7)

Creo que la forma más simple es hacer esto, por ejemplo, en el método ViewView ():

if (savedInstanceState == null && !mAlreadyLoaded) { mAlreadyLoaded = true; // Do this code only first time, not after rotation or reuse fragment from backstack }

Porque cuando Android pone un fragmento en backstack, solo destruye su vista, pero no mata la instancia, por lo que mAlreadyLoaded seguirá siendo cierto cuando el fragmento se restaure desde backstack.

He estado buscando este problema por un tiempo sin resultado ahora:

¿Cómo se determina la determinación del fragmento desde backstack? Estoy usando la biblioteca de compatibilidad y un ListFragment dentro de FragmentActivity. Cuando se selecciona un elemento dentro de ListFragment, se inicia un nuevo Fragment para reemplazar el ListFragment.

Noté que cuando FragmentActivity se detiene, se llama al onSaveInstanceState del Fragmento. Pero cuando el Fragmento se coloca en la pila posterior a través de FragmentTransaction, onSaveInstanceState no recibe una llamada, entonces los métodos del ciclo de vida onCreateView y onActivityCreated se llaman con null savedInstanceState Bundle.

Pregunto esto porque quiero cargar algunos datos cuando se crea o restaura el Fragmento, pero no cuando el usuario regresa. pila posterior.

Miré ¿Cómo comprobar si Fragment fue restaurado desde una backstack? pero quiero agregar más detalles con la esperanza de que esto incite una respuesta.

Editar: recién notado http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle) dice

Sin embargo, tenga en cuenta que este método se puede llamar en cualquier momento antes de onDestroy (). Hay muchas situaciones en las que un fragmento puede ser derribado (como cuando se coloca en la pila posterior sin UI), pero su estado no se guardará hasta que su actividad propietaria realmente necesite guardar su estado.

Entonces onSaveInstanceState definitivamente está fuera de discusión ...


Cuando un fragmento va a back-stack en onDestroyView() llamado. No en onDestroy() .

Y cuando aparece un fragmento de back-stack llamado onCreateView() . No onCreate() .

Añada un boolean mIsRestoredFromBackstack para fragmentar y siga los pasos a continuación:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mIsRestoredFromBackstack = false; } @Override public void onResume() { super.onResume(); if(mIsRestoredFromBackstack) { // The fragment restored from backstack, do some work here! } } @Override public void onDestroyView() { super.onDestroyView(); mIsRestoredFromBackstack = true; }


En algunos casos, puede usar el método isVisible para entender si muestra primero un fragmento o si se restauró de la pila trasera.


Si agregaste un fragmento a backstack, y luego de alguna manipulación lo ocultaste usando fragmentTransaction.hide (fragment) y luego lo restauraste desde backstack como fragmentTransaction.show (fragmentManager.findFragmentByTag (fragment.getName ())); puede anular enHiddenChanged (booleano oculto)

@Override public void onHiddenChanged(boolean hidden) { // TODO Auto-generated method stub super.onHiddenChanged(hidden); if (!hidden) { //fragment became visible //your code here } }


EDICIÓN MAYOR : 15 de octubre de 2013

La explicación anterior (que se incluye a continuación para referencia) falla cuando la aplicación se pone en segundo plano y vuelve al primer plano.

En cambio, es mejor comparar el tamaño actual de la backstack con el que se creó cuando se creó el fragmento y colocarlo en la backstack.

Eche un vistazo a la Figura 2 en http://developer.android.com/guide/components/fragments.html#Creating

Lo que esta figura te dice es que cuando un fragmento se restaura desde la backstack, no se llama a onCreate (), mientras que onCreateView () sí lo está.

Por lo tanto, es posible que desee hacer algo como esto:

public class MyFragment extends Fragment { int mBackStackSize = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBackStackSize = getFragmentManager().getBackStackEntryCount(); } public boolean isRestoredFromBackstack() { return mBackStackSize > getFragmentManager().getBackStackEntryCount(); } }


Fragment.getFragmentManager() == null

antes de agregar y después de estallar


getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() { public void onBackStackChanged() { Log.i(TAG, "back stack changed "); int backCount = getSupportFragmentManager().getBackStackEntryCount(); if (backCount == 0){ // block where back has been pressed. since backstack is zero. } } });

usa este addOnBackStackChangedListener.