En mi main.xml
tengo
<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, r3
y desarrollando para API level 7
.
findFragmentById()
y findFragmentByTag()
funcionará si hemos establecido un fragmento usando fragmentTransaction.replace
o fragmentTransaction.add
, pero funcionará return null
si 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()
enFragmentManager
y determinar qué fragmento se encuentra en suR.id.frameTitle
envase.fuente
fragmentTransaction.replac
e ofragmentTransaction.add
pero no lo conseguiremos si lo hemos establecido en xml. Ver mi edición 2findFragmentByTag
devuelve nulo en caso deActionBar
pestañas. En miActivity
que se extiende,ActionBarActivity
primero agrego pestañasActionBar
y luego lo encuentro.executePendingTransactions()
elFragmentManager
despué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 ordinarioFragmentTransaction
se 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 lasupport
parteCreo 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.replac
e ofragmentTransaction.add
pero no lo conseguiremos si lo hemos establecido en xml. Vea mi edición 2fragmentTag
es 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@hide
y 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,
Activity
asegú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