Android: establecer la identificación del fragmento

111

¿Cómo puedo configurar un Fragment's Idpara poder usarlo getSupportFragmentManager().findFragmentById(R.id.--)?

tyb
fuente
Puede configurarlo en el archivo xml de diseño
Vladimir Eremeev

Respuestas:

117

No puede establecer el ID de un fragmento mediante programación .

Sin embargo, hay una String tagque puede establecer dentro de FragmentTransaction que se puede utilizar para identificar de forma única un Fragment.

Como Aleksey señaló, se puede pasar un identificador de FragmentTransaction's add(int, Fragment)método. Sin embargo, esto no especifica el ID de un fragmento. Especifica el ID de a ViewGrouppara insertar el Fragment. Esto no es tan útil para el propósito que espero que tenga, porque no identifica únicamente Fragments, sino ViewGroups. Estos ID son de contenedores a los que se pueden agregar uno o más fragmentos de forma dinámica. El uso de un método de este tipo para identificar Fragments requeriría que agregue ViewGroups dinámicamente al diseño para cada Fragmentque inserte. Eso sería bastante engorroso.

Así que si tu pregunta es cómo crear un identificador único para un Fragmento va a añadir de forma dinámica, la respuesta es utilizar FragmentTransaction's add (int containerViewId, Fragmento fragmento, etiqueta de cadena) método y FragmentManagers' findFragmentByTag (String) método.

En una de mis aplicaciones, me vi obligado a generar cadenas de forma dinámica. Pero no es tan caro en relación con la FragmentTransaction real, de todos modos.

Otra ventaja del método de etiqueta es que puede identificar un Fragmento que no se está agregando a la IU. Consulte el método add (Fragment, String) de FragmentTransaction . Fragments no necesita tener Views! ¡También se pueden usar para mantener un estado efímero entre cambios de configuración!

Thomas Dignan
fuente
Si uso la etiqueta y no el ID del fragmento, ¿cómo usaría la llamada de reemplazo que necesita un ID de recurso de fragmento?
Namratha
12
@TomDignan ¿qué tal un fragmento que se agregará en un ViewPager? ¿Cómo puedo configurar su etiqueta? No puedo usar transacciones en esta situación.
GuilhE
1
@GuilhE Activity proporciona un método addFragment () al que puede hacer referencia desde el visor. Mantener la etiqueta antes de eso podría lograrse con un mapa de hash.
Thomas Dignan
1
¿Se puede editar un poco la respuesta para enfatizar que puede establecer la identificación en el diseño xml? Porque personalmente no leí otras preguntas y tenía la impresión de que no hay forma alguna de establecer la identificación en el fragmento ...
Ivan
41

Resulta que es posible que no necesite saber la identificación del fragmento.

De los documentos:

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

La parte importante es "como el ID del contenedor cuando se agrega en una transacción".

entonces:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

y entonces

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

obtendrá cualquier fragmento (impresionante) que se encuentre en R.id.fragment_holder.

Moose Moose
fuente
4

En la mayoría de los casos, puede utilizar la etiqueta de fragmento así como el ID.
Puede establecer el valor de la etiqueta en FragmentTransaction.add(Fragment fragment, String tag );. Luego, puede usar el comando FragmentManager.findFragmentByTag(String tab)para encontrar el fragmento en cuestión.

usuario2014118
fuente
2

Como ya mencionan Tom y otros, hay formas de poner una etiqueta en un fragmento y usar esa etiqueta para identificación. Un problema posterior con el que me he encontrado con esas soluciones es que el fragmento no obtiene una etiqueta hasta que se asocia con la Actividad (o, en realidad, la FragmentManager). ¿Qué hacer si se necesita identificar un fragmento antes de etiquetarlo?

Hasta ahora, todas mis soluciones se basan en el truco más antiguo (Java) del mundo: crear un fragmento de plantilla minimalista que toma una identificación en uno de sus constructores y proporciona un getFragmentId()método que devuelve esa identificación. Luego dejo que esos fragmentos que necesitan una identificación temprana extiendan esa plantilla y; voila! Problema resuelto.

Desafortunadamente, esta solución podría requerir un conjunto de fragmentos de plantilla, uno para cada tipo de fragmento ListFragment, DialogFragmento simplemente antiguos Fragment(¿POFO?) Que necesitan una identificación temprana. Pero esto es manejable en el caso de los fragmentos, creo, considerando las ganancias proporcionadas.

Perdón por romper las heridas que se están curando :-)

¡Salud!

dbm
fuente
0

Utilice lo siguiente:

Para agregar un fragmento:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

Para identificar el fragmento existente:

getFragmentManager().findFragmentByTag(fragmentName);
Jaydev
fuente
La respuesta no es relevante para la pregunta. Actualiza la respuesta. Codificación feliz
CodeWithVikas
-1

Cuando use una etiqueta, asegúrese de agregar el

fragmentTransaction.addToBackStack(null); 

método para que su Fragmento se reanude en lugar de destruirse como se menciona en las guías para desarrolladores.

Si no llama a addToBackStack () cuando realiza una transacción que elimina un fragmento, ese fragmento se destruye cuando se confirma la transacción y el usuario no puede volver a él. Mientras que, si llama a addToBackStack () al eliminar un fragmento, el fragmento se detiene y luego se reanuda si el usuario navega hacia atrás.

Puede encontrar esto al final de esta página .

Perdí unos 30 minutos tratando de averiguar por qué no se encontraba mi Fragmento a través de una simple findFragmentByTag();llamada

Panos Gr
fuente
-2

Además de la respuesta de Tom, el método de reemplazo también admite la etiqueta de fragmento, además del método de adición.

oren zvi
fuente