web-dev-qa-db-fra.com

Quelle est la différence entre getSupportFragmentManager () et getChildFragmentManager ()?

Ma classe hérite de Fragment et c'est pourquoi elle ne peut pas utiliser getSupportFragmentManager (). J'utilise getChildFragmentManager et il me montre Erreur - IllegalArguementException: Aucune vue trouvée pour id ... erreur.

Tout conseil serait apprécié.

Le code pour appeler AttachmentsListFragment est

Bundle b = new Bundle();
b.putSerializable("AttachmentsList", msg.attachments);  
        AttachmentListFragment listfrag = new AttachmentListFragment(msg.attachments);
FragmentTransaction transaction = getFragmentManager().beginTransaction();       
transaction.add(R.id.attachmentslistcontainer, listfrag);
transaction.addToBackStack(null);
transaction.commit();

attachmentslayout.xml est

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:id="@+id/attachmentslistcontainer"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/textViewAttachmentHeader"
        style="@style/Normal.Header.Toolbar"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:background="@color/list_separator_background"
        Android:ellipsize="end"
        Android:gravity="center"
        Android:maxLines="2"
        Android:text="@string/attachments_header"
        Android:textColor="#FFFFFFFF"
        Android:textSize="22sp"
        Android:textStyle="bold"
        Android:visibility="visible" />

    <ListView
        Android:id="@Android:id/list"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" >
    </ListView>

</FrameLayout>

AttachmentsListFragment.Java

public class AttachmentListFragment extends ListFragment implements IAttachmentsData {

    ArrayList<Attachments> items = null;
    Integer cellLayoutID;
    Integer index;

    public AttachmentListFragment() {

    }

    public AttachmentListFragment(ArrayList<Attachments> items) {
        this.items = items;
        Log.i("Logging", "Items size" + items.size()); //$NON-NLS-1$
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle;
        if (savedInstanceState != null) {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        //super.onCreateView(inflater, container, savedInstanceState);

        //  setContentView(R.layout.attachmentslayout);
        View view = inflater.inflate(R.layout.attachmentslayout, container, false);
        return view;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(new AttachmentAdapter(
                getActivity().getApplicationContext(),
                R.layout.attachmentslistcellcontent,
                items));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        index = position;
        Intent intent = new Intent();
        Bundle b = new Bundle();
        b.putByteArray("Data", items.get(position).getImageData());
        intent.putExtras(b);
    }


    public byte[] getData() {
        // TODO Auto-generated method stub
        if (items != null && index < items.size()) {

            return items.get(index).getImageData();
        }
            return null;
    }

}
61
NinjaCoder

La définition de getChildFragmentManager() est:

Renvoyez un FragmentManager privé pour placer et gérer des fragments à l'intérieur de ce fragment.

Pendant ce temps, la définition de getFragmentManager() (ou dans ce cas getSupportFragmentManager()) est:

Renvoyez le FragmentManager pour interagir avec les fragments associés à l'activité de ce fragment.

Fondamentalement, la différence est que les fragments ont maintenant leur propre FragmentManager interne qui peut gérer les fragments. Le FragmentManager enfant est celui qui gère les Fragments contenus uniquement dans le Fragment auquel il a été ajouté. L'autre FragmentManager est contenu dans l'ensemble du Activity.

Dans ce cas, ce que je suppose, c'est que vous avez ajouté les fragments au FragmentManager de l'activité. Vous obtenez le FragmentManager enfant qui ne contient pas ce que vous recherchez. Ainsi, vous obtenez l'exception car il ne peut pas trouver le fragment avec l'ID donné car il se trouve dans un FragmentManager différent.

129
DeeV

getFragmentManager appartient à Activity
getChildFragmentManager appartient à Fragment

Exemple, nous avons une application qui a MainActivity, Fragment1, Fragment2, container_view_on_main Est une mise en page dans activty_main.xml

POUR afficherFragment1 Sur MainActivity nous doit utiliser getSupportFragmentManager()

getSupportFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());

POUR afficherFragment2 De Fragment1 Nous avons 2 voies

UTILISER getFragmentManager()

getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());

UTILISER getChildFragmentManager()

Tout d'abord, nous devons créer une mise en page avec l'ID container_view_on_fragment1 À l'intérieur de fragment1.xml, Puis

getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit();

CONCLUSION

Dans cette démo, je pense que nous devrions utiliser getFragmentManager() quand passer de Fragment1 À Fragment2 Car c'est simple et bon pour la performance (Fragment1 S'arrêtera quand Fragment2 Ouvert)

Lorsque nous utilisons getChildFragmentManager()?
Exemple votre MainActivity a un ViewPager qui a 3 pages, à l'intérieur de chaque page vous devez remplacer un fragment.

PLUS
- getParentFragment ()
getFragmentManager() => retourne null
getChildFragmentManager() => renvoie toujours le fragment racine (Fragment1 dans la démo même si nous allons à Fragment3 , ...)

Cette réponse est basée sur ma compréhension, veuillez donc me corriger si je me trompe. J'espère que ça aide

13
Phan Van Linh

Si vous souhaitez avoir un fragment qui se comporte comme un conteneur de fragments, vous devez utiliser la méthode getChildFragmentManager du fragment. Si vous utilisez getSupportFragmentManager, vous utiliserez essentiellement le gestionnaire de fragments qui se comporte de la même manière que le cycle de vie de l'activité, et non de la manière dont fonctionne votre fragment.

Par exemple, j'avais un fragment qui contenait un ViewPager - il s'appelle CollectionsFragment. J'ai donc eu 3 fragments affichés sous forme d'onglets: AllCollectionsFragment, MyCollectionsFragment, FavouriteCollectionsFragment. Et j'ai donné getActivity (). GetSupportFragmentManager () au FragmentStatePagerAdapter que j'utilisais.

Cela provoquait donc le comportement suivant - les méthodes onDestroyView/onDestroy/onDetach/onStop des 3 fragments d'onglet ne devaient pas être appelées. Quand j'ai changé pour utiliser le getChildFragmentManager, tout allait bien.

Si vous le souhaitez, vous pouvez consulter les documents pour les deux méthodes:

getChildFragmentManager (): retourne un FragmentManager privé pour placer et gérer des fragments à l'intérieur de ce fragment.

getSupportFragmentManager (): renvoie le FragmentManager pour interagir avec les fragments associés à l'activité de ce fragment.

0