42 votes

Fragment n'a pas encore été attaché?

Voici mon code. Ce que j'essaie de faire, c'est d'afficher un viewholder à l'intérieur de mon Recycler view. À l'intérieur du view pager, j'affiche un fragment et en faisant glisser à gauche, j'affiche un autre fragment. Mais quand je lance l'application, l'application plante. Je ne sais pas où je me trompe. Je pense que c'est quelque part dans le concept de fragment. S'il vous plaît aidez-moi

 @Override
 public void onBindViewHolder(ManageCustomerViewHolder holder, int position) 
 {
     holder.viewPager.setAdapter(new MyPageAdapter(fragmentManager, fragments));
 }

 private List getFragments() 
 {
     List fList = new ArrayList();
     fList.add(MyFragment.newInstance("Fragment 1"));
     fList.add(Myfragment1.newInstance("Fragment 2"));

     return fList;
 }

 public class ManageCustomerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
 {
    ViewPager viewPager;
    viewPager = (ViewPager) itemView.findViewById(R.id.viewpager);

    itemView.setOnClickListener(this);
 }

C'est l'erreur :

java.lang.IllegalStateException: Le fragment n'a pas encore été attaché.

59voto

Akshay Goyal Points 551

J'ai rencontré le même problème dans mon application.

Trace de la pile :

java.lang.IllegalStateException: Fragment has not been attached yet. android.support.v4.app.Fragment.instantiateChildFragmentManager(Fragment.java:2154)
android.support.v4.app.Fragment.getChildFragmentManager(Fragment.java:704)

L'application plantait à cette ligne :

function performSomeActionInChildFragments() {
    List fragments = getChildFragmentManager().getFragments();
    ...
}

Cela se produit lorsque le fragment n'est plus attaché à son activité/fragment parent. Donc, une simple vérification isAdded() devrait résoudre ce problème pour vous.

Correction :

function performSomeActionInChildFragments() {
    if (!isAdded()) return;
    List fragments = getChildFragmentManager().getFragments();
    ...
}

Depuis la documentation :

isAdded() - Renvoie vrai si le fragment est actuellement ajouté à son activité.

12voto

C.BY Points 121

Met à jour la révision de la bibliothèque de support en 27.0.2 pour résoudre le problème. Voir journal des modifications.

8voto

Gian Gomen Points 774

J'ai rencontré cette exception aujourd'hui. Après avoir cherché une réponse, j'ai remarqué que tout est lié au ViewPager et à getFragmentManager() ou, dans mon cas, getChildFragmentManager().

Eh bien, parfois ces choses arrivent lorsqu'il n'y a pas de fragment, donc rien ne peut être attaché ou affiché. Par conséquent, lorsque mon fragment a été créé, j'ai maintenant sauvegardé dans une variable le gestionnaire de fragments, puis j'utilise ce gestionnaire dans mon instance ViewPager pour qu'un gestionnaire soit toujours enregistré dans la classe. Pour clarifier ce que je dis, voici mon code :

Avant

    ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
    adapter.addFragment(tabLlegadaFragment, "Llegada");
    adapter.addFragment(tabIngresoFragment, "Ingreso");
    viewPager.setAdapter(adapter);

Ici j'ai rencontré l'erreur parce que j'ai recréé la vue avec une méthode et j'ai également appuyé sur le bouton de retour. Donc lorsque cela s'est produit, Android cherche un getChildFragmentManager() d'un Fragment qui n'existe plus ou qui a disparu (car j'ai appuyé sur le bouton de retour)

Maintenant

    FragmentManager                 childFragMang;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       View view = inflater.inflate(R.layout.fragment_tab_main, container, false);
       ..
       childFragMang= getChildFragmentManager();
       ..
       return view;

    }

et lorsque j'appelle Viewpager, j'utilise ce gestionnaire

    ViewPagerAdapter adapter = new ViewPagerAdapter(childFragMang);
    adapter.addFragment(tabLlegadaFragment, "Llegada");
    adapter.addFragment(tabIngresoFragment, "Ingreso");
    viewPager.setAdapter(adapter);

Je n'ai plus rencontré cette exception car mon fragment avait disparu lorsque j'ai appuyé sur le bouton de retour et il n'y avait plus de getChildFragmentManager() à appeler

0voto

G. Blake Meike Points 2712

Vous ne devriez pas essayer d'instancier des fragments. Les fragments sont créés et ont des cycles de vie qui sont contrôlés par le système Android. Vous répondez aux événements du cycle de vie en annotant des méthodes de rappel comme onAttached (appelé lorsque le fragment est attaché à son Activité)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X