2012-02-20 11 views

Respuesta

100

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

Sin embargo, hay un String tag que puede establecer dentro de FragmentTransaction que se puede utilizar para identificar un Fragmento de manera única.

Como señaló Aleksey, puede pasar una identificación al método FragmentTransaction de add(int, Fragment). Sin embargo, esto no especifica la ID para un Fragmento. Especifica la ID de ViewGroup para insertar Fragment en. Esto no es tan útil para el propósito que espero que tenga, porque no identifica de forma única Fragment s, pero ViewGroup s. Estos ID son de contenedores que un o más fragmentos se pueden agregar de forma dinámica. El uso de dicho método para identificar Fragment s requeriría que agregue ViewGroup s dinámicamente al Diseño por 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 método y add(int containerViewId, Fragment fragment, String tag)FragmentManager' s findFragmentByTag(String) método.

En una de mis aplicaciones, me vi obligado a generar cadenas dinámicamente. 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 interfaz de usuario. Vea el método add(Fragment, String) de FragmentTransaction. Fragment s no necesita tener View s! ¡También se pueden usar para mantener el estado efímero entre cambios de configuración!

+0

Si utilizo la etiqueta y no el ID para el fragmento, ¿cómo Uso la llamada de reemplazo que necesita una identificación de recurso de fragmento? – Namratha

+0

@Namratha, no puedes. –

+9

@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

3

En la mayoría de los casos, puede usar la etiqueta de fragmento así como la 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.

2

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

Mis soluciones hasta ahora 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 método getFragmentId() que devuelve esa identificación. Luego dejo que los fragmentos que necesitan una identificación temprana amplíen esa plantilla y; voila! Problema resuelto.

Esta solución podría, por desgracia, requieren un conjunto de fragmentos de plantilla, una para cada tipo de fragmento, ListFragment, DialogFragment o llanura de edad Fragment (pofo ?!) que necesitan la identificación temprana. Pero esto es manejable en el caso de los fragmentos, creo, teniendo en cuenta las ganancias proporcionadas.

Lo siento por desgarrar la curación de heridas :-)

Salud!

35

Resulta que puede que no necesite conocer la identificación del fragmento.

A partir 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 añade en una transacción".

manera:

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

y luego

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

le conseguirá lo que sea (impresionante) fragmento se llevó a cabo en R.id.fragment_holder.

0

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

1

Usar la siguiente:

Para añadir un fragmento:

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

Para identificar el fragmento existente:

getFragmentManager().findFragmentByTag(fragmentName); 
Cuestiones relacionadas