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;
}
}
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.
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 nullgetChildFragmentManager()
=> 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
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.