En mi main.xmltengo
<FrameLayout
android:id="@+id/frameTitle"
android:padding="5dp"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/title_bg">
<fragment
android:name="com.fragment.TitleFragment"
android:id="@+id/fragmentTag"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
Y estoy configurando un fragmento de objeto como este
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Está configurando diferentes tipos de objetos Fragment ( FragmentType2,FragmentType3,...) en diferentes momentos. Ahora en algún momento necesito identificar qué objeto está actualmente allí.
En resumen , necesito hacer algo como esto:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Probé lo siguiente
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
y
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Pero ambos objetos (titleFragmentById y titleFragmentByTag) sonnull
¿Me perdí algo?
Estoy usando Compatibility Package, r3y desarrollando para API level 7.
findFragmentById()y findFragmentByTag()funcionará si hemos establecido un fragmento usando fragmentTransaction.replaceo fragmentTransaction.add, pero funcionará return nullsi hemos establecido el objeto en xml (como lo que hice en mi main.xml). Creo que me falta algo en mis archivos XML.
fuente

Respuestas:
Llamar
findFragmentById()enFragmentManagery determinar qué fragmento se encuentra en suR.id.frameTitleenvase.fuente
fragmentTransaction.replace ofragmentTransaction.addpero no lo conseguiremos si lo hemos establecido en xml. Ver mi edición 2findFragmentByTagdevuelve nulo en caso deActionBarpestañas. En miActivityque se extiende,ActionBarActivityprimero agrego pestañasActionBary luego lo encuentro.executePendingTransactions()elFragmentManagerdespués de llamarcommit()a la transacción, aunque no he probado esto. O puede usarsetContentView()para usar un archivo de diseño con una<fragment>etiqueta. Cualquiera de los dos ocurre sincrónicamente, por lo que el fragmento existirá dentro de laonCreate()propia llamada donde usóexecutePendingTransaction()osetContentView(). De lo contrario, un ordinarioFragmentTransactionse procesa de forma asíncrona, y ni siquiera habrá comenzado para cuandoonCreate()termine el tiempo .Prueba esto,
esto le dará el fragmento actual, luego puede compararlo con la clase de fragmento y hacer sus cosas.
fuente
getSupportFragmentManager()en su lugar, y quedará nulo sin lasupportparteCreo que puede usar el evento onAttachFragment puede ser útil para detectar qué fragmento está activo.
fuente
Creo que deberías hacer:
La razón es porque configura la etiqueta "fragmentTag" en el último fragmento que ha agregado (cuando llamó a replace).
fuente
fragmentTransaction.replace ofragmentTransaction.addpero no lo conseguiremos si lo hemos establecido en xml. Vea mi edición 2fragmentTages la etiqueta para el fragmento actual?Puede obtener la lista de los fragmentos y buscar el último.
Pero a veces (cuando navega hacia atrás) el tamaño de la lista sigue siendo el mismo, pero algunos de los últimos elementos son nulos. Entonces, en la lista, iteré hasta el último fragmento no nulo y lo usé.
fuente
getFragments()método. Está marcado con@hidey no se suponía que debía incluirse con el archivo jar de la biblioteca de soporte. No debe considerarse como parte de la API exportada.getFragments()hace, porque lo necesitas con bastante frecuencia. Creo que ahora también está disponible públicamente.Esta es la solución más simple y funciona para mí.
1.) agregas tu fragmento
2.)
fuente
Puede que sea tarde, pero espero que ayude a alguien más, también @CommonsWare ha publicado la respuesta correcta.
fuente
Quizás la forma más simple es:
Funciono para mi
fuente
Puede crear un campo en su clase de actividad principal:
Y luego dentro de cada clase de fragmento:
Su campo 'fr' es un fragmento actual Objeto
También funciona con popBackStack ()
fuente
Sé que ha pasado un tiempo, pero lo haré aquí en caso de que ayude a alguien.
La respuesta correcta con diferencia es (y la seleccionada) la de CommonsWare. Estaba teniendo el mismo problema que el publicado, el siguiente
siguió volviendo nulo. Mi error fue realmente tonto, en mi archivo xml:
El error fue que tenía android: tag INSTEAD OF android: id .
fuente
La respuesta de @Hammer funcionó para mí, estoy usando para controlar un botón de acción flotante
fuente
Si se está extendiendo desde AbstractActivity, podría usar el método getFragments ():
fuente
Si está definiendo el fragmento en el diseño XML de la actividad,
Activityasegúrese de llamarsetContentView()antes de llamarfindFragmentById().fuente
Si está utilizando BackStack ... y SOLO si está utilizando Back stack, intente esto:
fuente
Esto le dará el nombre de la clase de fragmento actual ->
fuente
Haga una comprobación (qué fragmento en el contenedor de actividad) en el método onStart;
Algunos chequean:
fuente