findFragmentById renvoie toujours null

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.