Respuestas:
No puede establecer el ID de un fragmento mediante programación .
Sin embargo, hay una String tag
que 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 ViewGroup
para insertar el Fragment
. Esto no es tan útil para el propósito que espero que tenga, porque no identifica únicamente Fragment
s, sino ViewGroup
s. 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 Fragment
s requeriría que agregue ViewGroup
s dinámicamente al diseño para cada Fragment
que 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 FragmentManager
s' 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 . Fragment
s no necesita tener View
s! ¡También se pueden usar para mantener un estado efímero entre cambios de configuración!
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.
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.
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
, DialogFragment
o 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!
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);
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