web-dev-qa-db-fra.com

Obtenir Fragment attaché dynamiquement à <FrameLayout>?

Eh bien, j'ai un simple <FrameLayout>:

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/FragmentContainer"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" />

Puis dans mon code, j'y ai ajouté un fragment:

FragClass aFrag = new FragClass();
getSupportFragmentManager().beginTransaction()
        .replace(R.id.FragmentContainer, aFrag).commit();

Et ailleurs dans mon code, je veux obtenir cet objet FragClass (extends Fragment) à partir de l'ID R.id.FragmentContainer.

j'ai essayé

((ViewGroup) findViewById(R.id.FragmentContainer)).getChildAt(0)

ou

((FrameLayout) findViewById(R.id.FragmentContainer)).getChildAt(0)

mais ils renvoient le View, au lieu du Fragment qui lui est attaché.

je sais que je peux garder la variable aFrag quelque part, donc je n'ai pas besoin de la retrouver. Mais je pense qu'il devrait y avoir un moyen de la récupérer.

37
midnite

Permettez-moi de conclure par une réponse complète :)

Dans ce cas, le Fragment ajouté dynamiquement utilise l'ID du conteneur View (ViewGroup).

réf: http://developer.Android.com/guide/components/fragments.html#Adding

Remarque: Chaque fragment nécessite un identifiant unique que le système peut utiliser pour restaurer le fragment si l'activité est redémarrée (et que vous pouvez utiliser pour capturer le fragment pour effectuer des transactions, comme le supprimer). Il existe trois façons de fournir un ID pour un fragment:

  • Fournissez l'attribut Android: id avec un ID unique.
  • Fournissez l'attribut Android: tag avec une chaîne unique.
  • Si vous ne fournissez aucun des deux précédents, le système utilise l'ID de la vue conteneur.

C'est parce que c'est un Fragment après tout, nous devons utiliser getSupportFragmentManager().findFragmentById() pour le récupérer, ce qui retourne un Fragent, au lieu de findViewById() qui retourne un View.

La réponse à ce problème serait donc:

((aFrag) getSupportFragmentManager().findFragmentById(R.id.FragmentContainer))

Merci à @Luksprog.

85
midnite