Je définis un identifiant pour mon fragment dans la mise en page XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/test_fragment" ...
Ensuite, j’ajoute ce fragment dans la méthode onCreate de l’activité:
MyFragment myFragment = new MyFragment(); fragmentTransaction.add(R.id.fragment_container, myFragment); fragmentTransaction.commit();
Cela fonctionne très bien. Remplacer des fragments et travaille également.
Plus tard, j’essaie de récupérer ce fragment par son identifiant dans l’une des méthodes de l’activité:
MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment);
Cela conduit à myFragment étant null
. Toujours.
Lorsque j’essaie de faire la même chose avec des balises au lieu d’ID, je peux récupérer le fragment par sa balise sans aucun problème:
MyFragment myFragment = new MyFragment(); fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment"); fragmentTransaction.commit();
…
MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment");
Pourquoi findFragmentById ne peut-il pas trouver le fragment, mais findFragmentByTag le fait? Est-ce que je manque quelque chose?
R.id.test_fragment
n’est pas l’ID de votre fragment mais l’id de votre LinearLayout
Appeler add(int containerViewId, Fragment fragment)
appenda un fragment sans balise. Donc ou vous utilisez add(int containerViewId, Fragment fragment, Ssortingng tag)
et vous récupérez votre fragment en utilisant votre tag (comme identifiant)
Utilisez la
tant que conteneur dans votre fichier de mise en page. Plus tard, pour remplacer dynamicment les fragments de votre activité, vous pouvez utiliser l’ID du conteneur
pour remplacer les fragments de votre activité.
ce devrait être un fragment
non un LinearLayout
J’utilisais android.support.v4.app.Fragment
dans ma mise en page en appelant getFragmentManager()
qui recherchait en réalité les sous-classes android.app.Fragment
et je suis devenu null
. La solution consistait donc à appeler getSupportFragmentManager()
place.
En général, assurez-vous que le paquetage d’un fragment que vous sous-classe et utilisez dans votre mise en page est identique à celui renvoyé par le FragmentManager
correspondant qui effectue la recherche.
R.id.test_fragment
est votre identifiant LinearLayout
non votre fragment.
Vous pouvez définir et identifier un fragment lorsqu’il est gonflé à partir d’un fichier XML, comme dans cet exemple http://developer.android.com/guide/topics/fundamentals/fragments.html#Adding
Ou, vous devriez avoir utilisé à la place:
(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container);
FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.containerb); if(fragmentB != null) { fragmentB.showuserResponse(msg); }
Utilisez l’ID du conteneur comme identifiant de fragment. Et puis vérifiez la référence null.
fragmentTransaction.add (R.id.fragment_container, myFragment);
MyFragment myFragment = (MyFragment) getFragmentManager (). FindFragmentById (R.id.test_fragment);
Veuillez noter la différence.
Vous devez transmettre R.id.fragment_container comme argument à findFragmentById
, au findFragmentById
à findFragmentById
que vous le transmettez à la fonction add, au lieu de R.id.test_fragment
Par ailleurs, selon l’implémentation interne des deux fonctions, il devrait être correct que l’id puisse être celui de sa vue conteneur.