findFragmentById renvoie toujours null
Je suis à la définition d'un ID pour mon fragment dans le fichier xml du layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/test_fragment"
...
Puis-je ajouter ce fragment dans la méthode onCreate:
MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment);
fragmentTransaction.commit();
C'est tous fonctionne bien. Remplacement de fragments et est également à l'œuvre.
Plus tard, je suis en train de récupérer ce fragment par son ID dans celui de l'activité, méthodes:
MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment);
Le faire conduit à myFragment être null
. Toujours.
Quand j'essaie de faire la même chose avec des mots au lieu de Id je peux récupérer le fragment de son étiquette 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 ne peut-findFragmentById trouver le fragment, mais findFragmentByTag fait? Ai-je raté quelque chose?
- Essayez
(MyFragment) getFragmentManager().findFragmentById(R.id.container);
Vous devez vous connecter pour publier un commentaire.
R.id.test_fragment
n'est pas l'ID de votre fragment mais l'id de votre LinearLayoutAppel
add(int containerViewId, Fragment fragment)
va ajouter un fragment sans étiquette.Donc, ou vous utilisez
add(int containerViewId, Fragment fragment, String tag)
et vous récupérez votre fragment à l'aide de votre tag (un ID)getFragmentById()
.add(...)
avec tag. Et les docs sont à droite. Vous avez juste à utiliser le bonFragmentManager
instance pourgetFragmentById()
travail dans la façon dont vous vous attendez à ce que cela fonctionne. Vérifier ma réponse ci-dessous pour plus d'informations.Utiliser le
<FrameLayout>
balise comme un conteneur dans votre fichier de mise en page. Plus tard, afin de remplacer les fragments de votre activité de façon dynamique, vous pouvez utiliser l'ID de la<FrameLayout>
conteneur pour remplacer les fragments dans votre activité.il devrait être un
fragment
pas unLinearLayout
J'ai été en utilisant
android.support.v4.app.Fragment
dans ma mise en page, tout en appelantgetFragmentManager()
qui en fait cherchéandroid.app.Fragment
sous-classes et j'ai eunull
.Ainsi, le correctif a été d'appeler
getSupportFragmentManager()
à la place.En général, assurez-vous que l'emballage d'un fragment de vous sous-classement et à l'aide de la mise en page est la même renvoyé par le correspondant
FragmentManager
qui effectue la recherche.R.id.test_fragment
est votreLinearLayout
ID pas votre Fragment.Vous pouvez définir et id sur un fragment lorsqu'il est gonflé à partir d'un xml comme dans cet exemple http://developer.android.com/guide/topics/fundamentals/fragments.html#Adding
Ou, vous devriez avoir à la place utilisé :
Utiliser l'id de conteneur en tant que fragment de l'id. Et puis vérifier la nullité de référence.
Veuillez remarquer la différence.
Vous devez passer à R. id.fragment_container comme argument de
findFragmentById
, comme vous le passer à la fonction add, au lieu deR.id.test_fragment
Par la façon dont , selon l'intérieure de la mise en œuvre des deux fonctions, il devrait être le droit que le code peut être
celle de son conteneur de vue.