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
es tu ID de LinearLayout
no tu Fragmento.
Puede definir e identificar en un fragmento cuando está inflado desde un xml como en este ejemplo http://developer.android.com/guide/topics/fundamentals/fragments.html#Adding
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.