3

J'espère que quelqu'un peut éclaircir ce que je fais mal ici. J'ai un Master Detail commun sur une tablette en mode paysage. La seule mise en garde est que certains éléments du masque ouvrent FragA dans la section Détail, et d'autres ouvrent FragB dans la section Détail. Tout semble bien, sauf le processus actuel de commutation des fragments. Quel que soit le fragment montré en premier est le seul qui montre. J'ai utilisé la méthode de remplacement pour les échanger, et tous les commentaires SO sur le sujet que je peux trouver indiquent que cela ne fonctionnera pas si j'ai ajouté les fragments de détail en XML. Malheureusement, cela ne s'applique pas pour moi puisque j'ajoute tous les fragments dynamiquement. Mon code ressemble à ceci:Remplacer le fragment Android ne fait rien

FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ? getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ; 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     if(frag.mFragment == null){ 
      frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName()); 
      ft.add(frag.target.getId(), frag.mFragment); 
      ft.commit(); 
      ft = getFragmentManager().beginTransaction(); 
     } 
     ft.replace(frag.target.getId(), frag.mFragment); 
     ft.commit(); 

C'est le seul code utilisé partout pour ajouter ces fragments, et ce qui semble se produire est selon fragment est ajouté d'abord fonctionne très bien, mais la méthode remplacer ne fonctionne pas du tout. Quel que soit le fragment était là ... toujours là.

Est-ce que quelqu'un sait ce que je fais mal?

Modifier

La section correspondante du fichier de mise en page ressemble à ceci:

<LinearLayout 
    android:id="@+id/fragments_holder" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <FrameLayout 
     android:id="@+id/list_fragment" 
     android:layout_width="0dp" 
     android:layout_weight="0.39" 
     android:layout_height="match_parent" /> 

    <FrameLayout 
     android:id="@+id/details_fragment" 
     android:layout_height="match_parent" 
     android:layout_weight="0.61" 
     android:layout_width="0dp" /> 

    <!-- ADD METADATA VIEW HERE --> 

</LinearLayout> 

Les deux FragmentInfo objets ont correctement une cible de l'FrameLayout avec id/details_fragment comme en témoigne le fait que l'un fonctionne correctement s'il est le premier ajouté.

Edit 2 Note: en utilisant ce bloc de code a aussi exactement le même résultat:

FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ? getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ; 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     if(frag.mFragment == null){ 
      frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName()); 
      ft.add(frag.target.getId(), frag.mFragment); 
      //ft.commit(); 
      //ft = getFragmentManager().beginTransaction(); 
     } else{ 
      ft.replace(frag.target.getId(), frag.mFragment); 
     } 
     //ft.replace(frag.target.getId(), frag.mFragment); 
     ft.commit(); 
     detailsContainer.setFragmentInfo(frag); 
+0

Afficher le fichier de mise en page –

+0

ajouté en modifier, bien que je ne pense pas qu'il devrait importer puisque comme je l'ai mentionné, le premier fragment ajouté (quel qu'il soit) apparaît correctement – akhalsa

Répondre

1

Replace est effectivement identique à une série de supprimer et ajouter des opérations. Même si le conteneur est vide, le remplacement est toujours sûr à utiliser (il est alors le même qu'un simple ajout). Je préfère utiliser les opérations de suppression et d'ajout explicites car il est plus facile de les raisonner.

Je pense que vos exemples de code ont quelques problèmes au début, mais il semble y avoir quelques chemins corrects une fois l'initialisation terminée. Dans le premier exemple de code, vous appelez add et replace avec la même instance de fragment (dans le cas où le fragment n'a pas encore été créé). Dans votre deuxième exemple de code, vous ne supprimez pas l'ancien fragment (dans le cas où le deuxième fragment à ajouter n'a pas encore été créé).

Je pense que votre premier exemple de code effectuera remplacer les opérations correctement si vous commentez (supprimer) le double d'ajouter:

FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ? getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ; 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     if(frag.mFragment == null){ 
      frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName()); 
      // ft.add(frag.target.getId(), frag.mFragment); 
      // ft.commit(); 
      // ft = getFragmentManager().beginTransaction(); 
     } 
     ft.replace(frag.target.getId(), frag.mFragment); 
     ft.commit();