2012-05-31 4 views
49

Je définir un ID pour mon fragment dans la mise en page xml:findFragmentById retourne toujours null

<?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 de l'activité:

MyFragment myFragment = new MyFragment(); 
fragmentTransaction.add(R.id.fragment_container, myFragment); 
fragmentTransaction.commit(); 

Ceci est tout travail bien. Remplacer des fragments et fonctionne également.

Plus tard, je suis en train de récupérer ce fragment par son ID dans l'une des méthodes de l'activité:

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment); 

Faire conduit ainsi myFragment être null. Toujours.

Lorsque je tente de faire la même chose avec des balises au lieu d'ID que je peux récupérer le fragment par 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 pas findFragmentById trouver le fragment, mais findFragmentByTag le fait? Est-ce que je manque quelque chose?

+0

Essayez '(MyFragment) getFragmentManager(). FindFragmentById (R.id.container);' – offset

Répondre

37

R.id.test_fragment est pas l'ID de votre fragment, mais l'identifiant de votre LinearLayout

Appel add(int containerViewId, Fragment fragment) ajoutera un fragment sans étiquette. Alors ou vous utilisez add(int containerViewId, Fragment fragment, String tag) et vous récupérez votre fragment en utilisant votre balise (comme ID)

+15

Ceci est une solution de contournement valide, mais n'a pas répondu à la question. Jetez un coup d'œil sur les documents pour une description correcte. Les docs disent que l'identifiant est soit assigné lors du gonflement du fragment de xml ou est l'identifiant du conteneur lorsqu'il est ajouté en utilisant une transaction ... http://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int – speedynomads

+0

Voir cette réponse pour une bonne description sur l'attribution par programmation des ID: http://stackoverflow.com/a/13241629/857681 – speedynomads

+5

Si un fragment est ajouté sans ID, ne pouvez-vous pas le trouver en utilisant l'ID du conteneur, il est placé dans? Je suis sûr que c'est une chose. –

3
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/test_fragment" 

il devrait être un fragment pas LinearLayout

<fragment android:name="com.example.yourfragment" 
      android:id="@+id/test_fragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
+0

Alors, que dois-je changer? Je ne peux pas définir ma mise en page avec comme noeud supérieur. Je ne peux pas ajouter les fragments dans la mise en page xml de l'activité car je dois les supprimer plus tard. – Viper

+1

voir l'édition ... – Blackbelt

+0

Ok que vous ne pouvez pas définir de fragment dans la mise en page. Si vous avez besoin de récupérer le linerarlayout, vous devez utiliser le paramètre inflater dans le onCreateView – Blackbelt

1

Ou, vous devriez avoir plutôt utilisé:

(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container); 
9

Utilisez la balise <FrameLayout> comme conteneur dans votre fichier de mise en page . Plus tard, pour remplacer dynamiquement les fragments de votre activité, vous pouvez utiliser l'ID du conteneur <FrameLayout> pour remplacer les fragments de votre activité.

<FrameLayout 
      android:id="@+id/test_fragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
+0

A travaillé pour moi! –

-1

fragmentTransaction.add (R.id.fragment_container, myFragment);

MyFragment myFragment = (MonFragment) getFragmentManager(). FindFragmentById (R.id.test_fragment);

Veuillez noter la différence.

Vous devez passer R.id.fragment_container comme argument de findFragmentById, que vous passez à la fonction d'ajout, au lieu de R.id.test_fragment

Par ailleurs, selon la mise en œuvre interne des deux fonctions, elle doit être juste que l'ID peut être celui de sa vue de conteneur.

3

j'utilisais android.support.v4.app.Fragment dans ma mise en page tout en appelant getFragmentManager() qui recherche réellement pour android.app.Fragment et je suis arrivé sous-classes null. Donc, le correctif était d'appeler getSupportFragmentManager() à la place.

En général, assurez-vous que le package d'un fragment que vous sous-classifiez et que vous utilisez dans votre modèle est le même que celui renvoyé par le FragmentManager correspondant qui effectue la recherche.

0
FragmentB fragmentB = 
(FragmentB) getSupportFragmentManager().findFragmentById(R.id.containerb); 

if(fragmentB != null) 
{ 
    fragmentB.showuserResponse(msg); 
} 

Utilisez l'ID du conteneur comme ID de fragment. Et puis vérifiez la référence null.

Questions connexes