Mi problema

De acuerdo a la de Google docs:

Ahora puede incrustar fragmentos en el interior de los fragmentos. Esto es útil para un
la variedad de situaciones en las que desea lugar dinámico y re-utilizable
Componentes de interfaz de usuario en un componente de interfaz de usuario que es en sí misma dinámica y
re-utilizable. Por ejemplo, si utiliza ViewPager para crear fragmentos que
deslízate a la izquierda y a la derecha y consumir una mayoría del espacio de la pantalla, usted
ahora puede insertar fragmentos en cada fragmento de la página. Para anidar un fragmento,
simplemente llame a getChildFragmentManager() en el Fragmento en el que
quiero añadir un fragmento. Esto devuelve un FragmentManager que puede
uso como lo hace normalmente desde el nivel superior de la actividad para crear
fragmento de las transacciones. Por ejemplo, el siguiente código añade un
el fragmento dentro de un Fragmento de la clase:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

Así que he creado mi propia PageFragment. Y mi PageFragmentAdapterconsta de 3 páginas de PageFragment.
También tengo seis fragmentos de: Fragment1, Fragment2, Fragment3, FragmentA, FragmentB, FragmentC.
En mi MainActivity inicializo a mis seis fragmentos, mi ViewPager y su PageFragmentAdapter (que inicializar tres PageFragment por sí mismo).

Entonces yo uso este método para adjuntar mi Fragment1, Fragment2, Fragment3 para cada página (para cada PageFragment) de PageFragmentAdapter:

PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);

Puedo recibir (a través de métodos en PageFragmentAdapter) Fragmentos y hacer «anidada fragmento de» en mi PageFragment (por supuesto, en onCreate()) como:

getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();

Nota: yo uso PageFragment.setNestedFragment() para establecer mFragment.

Y funciona muy bien!
Me va a ayudar (pero esta historia no es sobre esto) simplemente reemplazar fragmentos en ViewPager como:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

Pero tengo un gran problema.
De nuevo Google docs:

Implementación de PagerAdapter que representa cada página como un Fragmento
que es persistentemente mantenido en el fragmento manager como el tiempo que el usuario
puede volver a la página. Esta versión de la paginador es mejor para su uso cuando
hay un puñado de, normalmente, más estática fragmentos ser paginado
a través de una serie de pestañas. El fragmento de cada página que el usuario
visitas se guardarán en la memoria, aunque su punto de vista de la jerarquía puede ser
destruido cuando no visible. Esto puede resultar en el uso de un significativo
cantidad de memoria desde fragmento casos puede aferrarse a un arbitrario
cantidad de estado.

Como se puede ver PageFragmentAdapter puede destruir uno de mis PageFragment y, por supuesto, sus anidada fragmento. Y cuando será recreado tendrá un valor NULL en lugar mFragment valor.
Estoy tratando de ahorrar a través de getChildFragmentManager().putFragment() y, a continuación, obtener al getChildFragmentManager().getFragment(). Pero no funcionó.

Pregunta

Así que mi pregunta es: Cómo salvar mi anidada fragmento de mi padre fragmento? Es posible?

Les agradecería mucho su ayuda. Alex. P. S. Realmente lo siento por mi inglés:)

EDITAR

Thx @AndroidBegin.com por la respuesta!

Esto parece ser un error en el recién añadido soporte para anidados
los fragmentos. Básicamente, el niño FragmentManager termina con una fractura de
estado interno cuando se separa de la actividad. A corto plazo
solución que fijo que es para mí, es para agregar el siguiente a onDetach()
de cada Fragmento que te llame getChildFragmentManager() en:

@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}
Que me ayude! Comparte tu idea!

OriginalEl autor AlexMomotov | 2013-09-24

1 Comentario

  1. 11

    Pruebe esto en su fragmento.

    public class Fragment2 extends SherlockFragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.viewpager_main, container, false);
            //Locate the ViewPager in viewpager_main.xml
            ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
            //Set the ViewPagerAdapter into ViewPager
            mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager()));
            return view;
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            try {
                Field childFragmentManager = Fragment.class
                        .getDeclaredField("mChildFragmentManager");
                childFragmentManager.setAccessible(true);
                childFragmentManager.set(this, null);
            } catch (NoSuchFieldException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
    }

    Fuente : http://www.androidbegin.com/tutorial/actionbarsherlock-side-menu-navigation-nested-viewpager-fragment-tabs-tutorial/

    OK. Y cómo conseguir FragmentManager de Campo?
    Sigo esperando respuesta correcta :\
    Echa un vistazo a esta pregunta para obtener más información de stackoverflow.com/a/15656428/2397414
    wow! Muchas gracias!

    OriginalEl autor AndroidBegin.com

Dejar respuesta

Please enter your comment!
Please enter your name here