tutorial studio onattach navegar implement how fragments example entre ejemplo activity android android-fragments

onattach - navegar entre fragments android studio



findFragmentById siempre devuelve null (8)

Estoy definiendo una identificación para mi fragmento en el diseño xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/test_fragment" ...

Luego agrego este fragmento en el método onCreate de la actividad:

MyFragment myFragment = new MyFragment(); fragmentTransaction.add(R.id.fragment_container, myFragment); fragmentTransaction.commit();

Esta todo trabajando bien. Reemplazar fragmentos y también está funcionando.

Más tarde estoy tratando de recuperar este fragmento por su ID en uno de los métodos de la actividad:

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment);

Si lo haces, miFragmento será null . Siempre.

Cuando trato de hacer lo mismo con las etiquetas en lugar de los ID, puedo recuperar el fragmento por su etiqueta sin ningún problema:

MyFragment myFragment = new MyFragment(); fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment"); fragmentTransaction.commit();

...

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment");

¿Por qué no puede findFragmentById encontrar el fragmento, pero findFragmentByTag lo hace? ¿Me estoy perdiendo de algo?


fragmentTransaction.add (R.id.fragment_container, myFragment);

MyFragment myFragment = (MyFragment) getFragmentManager (). FindFragmentById (R.id.test_fragment);

Por favor note la diferencia.

Debería pasar R.id.fragment_container como el argumento para findFragmentById , al pasarlo a la función add, en lugar de a R.id.test_fragment

Por cierto, de acuerdo con la implementación interna de las dos funciones, debería ser correcto que el ID pueda ser el de su vista de contenedor.


Estaba usando android.support.v4.app.Fragment en mi diseño mientras llamaba a getFragmentManager() que realmente buscaba las subclases de android.app.Fragment y obtenía null . Así que la solución fue llamar a getSupportFragmentManager() lugar.

En general, asegúrese de que el paquete de un fragmento que esté subclasificando y utilizando en su diseño sea el mismo devuelto por el FragmentManager correspondiente que realiza la búsqueda.


O bien, deberías haber usado:

(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container);


Use la etiqueta <FrameLayout> como un contenedor en su archivo de diseño. Luego, para reemplazar dinámicamente los fragmentos de su actividad, puede usar la ID del contenedor <FrameLayout> para reemplazar los fragmentos en su actividad.

<FrameLayout android:id="@+id/test_fragment" android:layout_width="match_parent" android:layout_height="match_parent" />



R.id.test_fragment no es el ID de tu fragmento, sino el ID de tu LinearLayout

La llamada a add(int containerViewId, Fragment fragment) agregará un fragmento sin una etiqueta. Entonces, o usa add(int containerViewId, Fragment fragment, String tag) y recupera su fragmento con su etiqueta (como ID)


<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/test_fragment"

debería ser un fragment no un LinearLayout

<fragment android:name="com.example.yourfragment" android:id="@+id/test_fragment" android:layout_width="match_parent" android:layout_height="match_parent" />


FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.containerb); if(fragmentB != null) { fragmentB.showuserResponse(msg); }

Use el identificador de contenedor como identificador de fragmento. Y luego verifica la referencia nula.