Fragment Android aucune vue trouvée pour l'ID?

287

J'ai un fragment que j'essaie d'ajouter à une vue.

FragmentManager fragMgr=getSupportFragmentManager();
feed_parser_activity content = (feed_parser_activity)fragMgr
                                    .findFragmentById(R.id.feedContentContainer);
FragmentTransaction xaction=fragMgr.beginTransaction();

if (content == null || content.isRemoving()) {
    content=new feed_parser_activity(item.getLink().toString());
    xaction
        .add(R.id.feedContentContainer, content)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .addToBackStack(null)
        .commit();
    Log.e("Abstract", "DONE");
}

Lorsque ce code est exécuté, j'obtiens l'erreur suivante dans le débogage.

java.lang.IllegalArgumentException: No view found for id 0x7f080011 
   for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}

feed_parser_activityest un fragment qui est défini sur la disposition des fragments en xml.
J'utilise une FragmentActivity pour héberger la disposition des fragments contenant le feed_parser_layout.
Suis-je en train de coder cela correctement ci-dessus?

coder_For_Life22
la source
3
Pouvez-vous inclure le XML?
jsmith
1
On peut obtenir la même erreur lors de la transaction de fragment avant d'appeler setContentView dans Activity
Pavel

Réponses:

374

J'avais aussi ce problème, jusqu'à ce que je réalise que j'avais spécifié la mauvaise disposition dans setContentView()la onCreate()méthode de FragmentActivity.

L'ID transmis dans FragmentTransaction.add(), dans votre cas R.id.feedContentContainer, doit être un enfant de la disposition spécifiée dans setContentView().

Vous ne nous avez pas montré votre onCreate()méthode, alors c'est peut-être le même problème.

howettl
la source
5
Qu'entendez-vous par enfant de la disposition spécifiée dans setContentView? Comment le rendre enfant?
NinjaCoder
11
Une vue est un enfant d'une autre vue si elle est déclarée à l'intérieur de la vue parent dans le XML. c'est à dire. un TextViewintérieur d'un RelativeLayoutest un enfant du RelativeLayout.
howettl
@howettl: Je sais que c'est un peu vieux poste. Mais je ne suis pas en mesure de résoudre ce problème avec votre réponse. Voici donc la question: stackoverflow.com/questions/25844394/… - Pouvez-vous m'aider avec cela s'il vous plaît? Merci!
TheDevMan
@howettl, pouvez-vous s'il vous plaît m'aider avec un problème similaire. stackoverflow.com/questions/26966623/…
Vamsi Challa
3
Qui m'est arrivé. L'inconvénient de CTRL + C CTRL + V.
0nyx
295

Cette erreur se produit également lorsque vous avez des fragments imbriqués et que vous les ajoutez avec getSupportFragmentManager () au lieu de getChildFragmentManager ().

Malachiasz
la source
10
La mienne était l'inverse. J'essayais d'ajouter au conteneur de fragments principal en appelant getChildFragmentManager (). Le faire remarquer l'a résolu pour moi. Merci +1
speedynomads
@Malachiasz: Pourriez-vous jeter un oeil à cette question sur ViewPager? Merci stackoverflow.com/questions/27937250/…
Hoa Vu
C'était exactement mon problème, merci. Curieusement, cela ne s'est produit qu'en orientation paysage lors de l'appel de .show (). L'utiliser pour remplacer le fragment principal a bien fonctionné.
cohenadair
1
C'était exactement mon problème, merci beaucoup! Cela ne se produisait que sur certains appareils lents, il était donc difficile de comprendre ce qui se passait exactement.
YawaraNes
1
Après être venu à cette question à plusieurs reprises, je sentais que personne d'autre n'avait mon problème, je devais juste faire défiler un peu. Ce serait bien s'ils pouvaient obtenir le code d'erreur pour être plus précis pour dire que cela pourrait être le cas.
KodyVanRy
67

La solution consistait à utiliser getChildFragmentManager()

au lieu de getFragmentManager()

lors de l'appel à partir d'un fragment. Si vous appelez la méthode à partir d'une activité, utilisez alors getFragmentManager().

Cela résoudra le problème.

Sterling Diaz
la source
4
@ surfer190 utiliser à la getSupportFragmentManager()place.
Amir Hossein Ghasemi
Modifié en getChildFragmentManager () et cela fonctionne !!
Shyam
Dans mon cas, j'utilisais la navigation par fragments à l'aide du viseur dans le fragment de feuille inférieur. Votre solution a parfaitement fonctionné !! Des tonnes de Thanx bro.
Debasish Ghosh
1
eu le même problème et cela l'a résolu pour moi! getChildFragmentManager () au lieu de getActivity (). getFragmentManager () qui a du sens une fois que j'y ai pensé :) TY!
Simon
J'appelle la méthode à partir d'une activité mais getFragmentManager()est obsolète, maintenant!
Alireza Noorali
29

J'ai eu ce problème (lors de la construction de mon interface utilisateur dans le code) et il était causé par mon ViewPager(qui montrait Fragments) ne pas avoir un ensemble d'ID, donc j'ai simplement utilisé pager.setID(id)et puis cela a fonctionné.

Cette page m'a aidé à comprendre cela.

kaka
la source
1
J'ai eu le même problème lors de l'utilisation de viewPager. La même erreur a été corrigée en utilisant viewPager.setCurrentItem (n) avant d'effectuer la transaction. Ce sera peut-être utile pour quelqu'un.
Kirk Hammett
Dans mon cas, c'était dans la même direction, mais le problème était que j'utilisais une valeur négative dans .setID. L'utilisation d'un entier positif a résolu le problème.
Ignacio Hagopian du
29

Un autre scénario que j'ai rencontré. Si vous utilisez des fragments imbriqués, dites un ViewPager dans un Fragment avec ses pages aussi Fragments.

Lorsque vous effectuez une transaction de fragment dans le fragment interne (page de ViewPager), vous aurez besoin

FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

getActivity () est la clé ici. ...

zdd
la source
ouais ... pour moi, toutes les autres implémentations étaient bien en dehors de cela. J'ai directement essayé d'accéder au code comme ceci: FragmentTransaction transaction = getSupportFragmentManager (). BeginTransaction (); Ensuite, j'ai obtenu le fragmentmanager en utilisant getActivity () séparément comme vous l'avez mentionné. Cela fonctionne bien
anand krish
18

Dans mon cas, j'essayais d'afficher un DialogFragment contenant un pager et cette exception a été levée lorsque le FragmentPagerAdapter a tenté d'ajouter les fragments au pager. Sur la base de la réponse howettl, je suppose que cela était dû au parent du pageur n'était pas la vue définie dans setContentView () dans mon FragmentActivity.

Le seul changement que j'ai fait pour résoudre le problème a été de créer le FragmentPagerAdapter en passant dans un FragmentMager obtenu en appelant getChildFragmentManager (), pas celui obtenu en appelant getFragmentManager () comme je le fais normalement.

    public class PagerDialog extends DialogFragment{

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

        View rootView = inflater.inflate(R.layout.pager_dialog, container, false);

        MyPagerAdapter pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
        ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
        pager.setAdapter(pagerAdapter);

        return rootView;
    }
}
garibay
la source
getChildFragmentManager () n'est pas accessible depuis DialogFragment
Abdalrahman Shatou
14

Cette exception peut également se produire si l'ID de mise en page vers lequel vous passez FragmentTransaction.replace(int ID, fragment)existe dans d'autres mises en page gonflées. Assurez-vous que l'ID de mise en page est unique et qu'il devrait fonctionner.

ealihodzic
la source
Le compilateur ne signale pas si l'id est manquant dans la mise en page actuelle si ce n'est pas unique, donc le vrai problème n'est pas l'unicité de l'id mais l'omission de l'id dans la mise en page actuelle.
Samuel
13

Une réponse que j'ai lue sur un autre fil similaire à celui-ci qui a fonctionné pour moi quand j'ai eu ce problème impliquait la mise en page XML.

Votre logcat indique "Aucune vue trouvée pour l'identifiant 0x7f080011".

Ouvrez le gen->package->R.java->id, puis recherchez id0x7f080011 .

Quand j'ai eu ce problème, cet identifiant appartenait à un FrameLayoutdans monactivity_main.xml fichier.

Le FrameLayout n'avait pas d'ID (il n'y avait pas de déclaration android:id = "blablabla" ).

Assurez-vous que tous vos composants dans toutes vos présentations ont des ID, en particulier le composant cité dans le logcat.

scottysseus
la source
1
Agréable. Dans Android Studio avec LinuxOS, c'est ici: / home / bob / AndroidStudioWorkspace / HelloWorld / app / build / généré / source / r / release / android / support / v7 / appcompat.
portsample
11

J'ai eu cette erreur lors de la mise à niveau de com.android.support:support-v4:21.0.0vers com.android.support:support-v4:22.1.1.

J'ai dû changer ma disposition à partir de ceci:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout> 

Pour ça:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

</FrameLayout> 

La disposition DOIT donc avoir une vue enfant. Je suppose qu'ils l'ont appliqué dans la nouvelle bibliothèque.

ono
la source
9

Avec des fragments imbriqués

Pour moi en utilisant getChildFragmentManager()au lieu d'un getActivity().getSupportFragmentManager()crash résolu

java.lang.IllegalArgumentException: aucune vue trouvée pour l'ID

UdayaLakmal
la source
mais à l'intérieur de l'adaptateur ne peut pas améliorer getchildFragmentManger pourquoi
Sunil Chaudhary
8

Je sais que cela a déjà été répondu pour un scénario, mais mon problème était légèrement différent et j'ai pensé partager au cas où quelqu'un d'autre serait à ma place.

Je faisais une transaction à l'intérieur onCreate(), mais à ce stade, l'arborescence de la vue n'a pas été gonflée, vous obtenez donc la même erreur. Mettre le code de transaction dansonResume() permis à tout de fonctionner correctement.

Assurez-vous donc que votre code de transaction s'exécute après le gonflage de l'arborescence!

pseudo
la source
3
Hmm ... dans mon cas, peu importe que ce code soit dans onCreate ou onResume
IgorGanapolsky
@IgorGanapolsky dans mon cas aussi, a résolu cela avec un rappel de fragment onAttach. Voir ma réponse
Alexander Malakhov
C'était exactement mon problème. Un appel à une autre classe pour actualiser un état d'affichage effectuait une transaction de fragment sur une disposition qui n'avait pas encore été gonflée. L'appeler dans onResume () a résolu le problème.
AWT
8

J'étais confronté à une erreur Nasty lors de l'utilisation de Viewpager dans Recycler View. Ci-dessous l'erreur que j'ai rencontrée dans une situation particulière. J'ai commencé un fragment qui avait un RecyclerView avec Viewpager (en utilisant FragmentStatePagerAdapter). Cela a bien fonctionné jusqu'à ce que je passe à un fragment différent en cliquant sur une cellule dans RecyclerView, puis que je retourne en utilisant le bouton Retour du téléphone et l'application se bloque.

Et ce qui est drôle à ce sujet, c'est que j'avais deux Viewpagers dans le même RecyclerView et que les deux étaient à environ 5 cellules (l'autre n'était pas visible à l'écran, il était en panne). Donc, au départ, j'ai simplement appliqué la solution au premier Viewpager et laissé l'autre tel quel (Viewpager utilisant des fragments).

La navigation en arrière a bien fonctionné, lorsque le premier téléavertisseur était visible. Maintenant, quand je suis descendu vers le second, puis que j'ai changé de fragment et que je suis revenu, il s'est écrasé (la même chose s'est produite avec le premier). J'ai donc dû changer les deux Viewpagers.

Quoi qu'il en soit, lisez ci-dessous pour trouver une solution de travail. Erreur de plantage ci-dessous:

java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}

J'ai passé des heures à le déboguer. Lisez cet article de discussion complet jusqu'au bas en appliquant toutes les solutions, y compris en vous assurant que je passe childFragmentManager.

Rien n'a fonctionné.

Enfin, au lieu d'utiliser FragmentStatePagerAdapter, j'ai étendu PagerAdapter et l'ai utilisé dans Viewpager sans utiliser de fragments. Je crois que certains où il y a un BUG avec des fragments imbriqués. Quoi qu'il en soit, nous avons des options. Lis ...

Le lien ci-dessous a été très utile:

Viewpager sans fragments

Le lien peut mourir, je publie ma solution implémentée ci-dessous:

public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;

// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
    //super(fm);
    this.mContext = mContext;
    this.productDetails = productDetails;
}

// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);

    imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
    String url = null;
    if (imagelists != null) {
        url = imagelists.get(position).getImage();
    }

    // This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
    ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);

    // Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
    container.addView(layout);
    return layout;
}

// Write as it is. I don't know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
    /*super.destroyItem(container, position, object);*/
}

// Get the count
@Override
public int getCount() {
    int size = 0;

    if (productDetails != null) {
        imagelists =  productDetails.getImagelist();
        if (imagelists != null) {
            size = imagelists.size();
        }
    }
    Log.d(TAG,"Adapter Size = "+size);
    return size;
}

// Write as it is. I don't know much about it
@Override
public boolean isViewFromObject(View view, Object object) {

    return view == object;
}

}

J'espère que cela a été utile !!

Nilesh
la source
Oui, cette solution a fonctionné, mais que faire si j'ai besoin d'une construction difficile avec son propre cycle de vie et ses propres variables, mais pas seulement des vues? Il sera utilisé avec videoViews et imageViews avec des boutons de lecture et de sourdine. Rien d'utile pour mon cas?
Nikita Axyonov
Je crois que c'est la raison: stackoverflow.com/a/27966053/1377819
Hoang Nguyen Huu
7

J'avais le même problème, mais mon problème se posait sur le changement d'orientation. Aucune des autres solutions n'a fonctionné. Il s'avère donc que j'ai oublié de supprimer setRetainInstance(true);de mes fragments, lors de la mise en page à deux ou un volets en fonction de la taille de l'écran.

VM4
la source
mettez false votre setRetainInstance (true) si vous êtes dans un fragment imbriqué, cela corrigera l'erreur.
ralphgabb
5

Mon erreur était sur le FragamentTransaction.

Je faisais ça t.replace(R.layout.mylayout);au lieu det.replace(R.id.mylayout);

La différence est que l'un est la mise en page et l'autre est une référence à la layout(id)

mut tony
la source
4

Juste au cas où quelqu'un aurait fait la même erreur stupide que moi; vérifiez que vous n'écrasez pas le contenu de l'activité quelque part (c.-à-d. recherchez des appels supplémentaires à setContentView)

Dans mon cas, en raison d'une copie et d'un collage imprudents, j'ai utilisé DataBindingUtil.setContentView dans mon fragment, au lieu de DataBindingUtil.inflate, qui a perturbé l'état de l'activité.

Squimon
la source
3

J'ai eu ce même problème, laissez-moi poster mon code pour que vous puissiez tous le voir, et ne pas faire la même chose que moi.

@Override
protected void onResume()
{
    super.onResume();

    fragManager = getSupportFragmentManager();

    Fragment answerPad=getDefaultAnswerPad();
    setAnswerPad(answerPad);
    setContentView(R.layout.abstract_test_view);
}
protected void setAnswerPad(AbstractAnswerFragment pad)
{
    fragManager.beginTransaction()
        .add(R.id.AnswerArea, pad, "AnswerArea")
        .commit();
    fragManager.executePendingTransactions();
}

Notez que je configurais des fragments avant moi setContentView. Oups.

PearsonArtPhoto
la source
1
Je vous remercie! Je faisais la même chose, alors j'ai mis mon setContentViewintérieuronBuildHeaders
Randy
3

Cette page semble être un bon emplacement central pour publier des suggestions sur le Fragment IllegalArgumentException. Voici encore une chose que vous pouvez essayer. C'est ce qui a finalement fonctionné pour moi:

J'avais oublié que j'avais un fichier de mise en page séparé pour l'orientation paysage. Après avoir ajouté mon conteneur FrameLayout là aussi, le fragment a fonctionné.


Sur une note distincte, si vous avez déjà essayé tout le reste suggéré sur cette page (et sur tout Internet également) et que vous vous êtes arraché les cheveux pendant des heures, envisagez de simplement jeter ces fragments ennuyeux et de revenir à une bonne vieille disposition standard. (C'est en fait ce que j'étais en train de faire lorsque j'ai finalement découvert mon problème.) Vous pouvez toujours utiliser le concept de conteneur. Cependant, au lieu de le remplir avec un fragment, vous pouvez utiliser la includebalise xml pour le remplir avec la même disposition que vous auriez utilisée dans votre fragment. Vous pouvez faire quelque chose comme ça dans votre mise en page principale:

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

    <include layout="@layout/former_fragment_layout" />

</FrameLayout>

former_fragment_layoutest le nom du fichier de disposition xml que vous tentiez d'utiliser dans votre fragment. Voir Réutiliser les mises en page avec include pour plus d'informations.

Suragch
la source
c'est une bonne suggestion, mais cela ne fonctionne pas si l'on a besoin de changer de fragments dynamiquement. Cela réduit également la réutilisation, car vous pouvez encapsuler le comportement (code) dans le fragment.
Alexander Malakhov
Je suis définitivement d'accord. Les fragments sont bien meilleurs.
Suragch
2

Dans mon cas, j'avais un SupportMapFragment dans un élément de vue recycleur (j'utilisais le surdébit inférieur "liteMode" qui fait apparaître la carte comme non interactive, presque comme une image statique). J'utilisais le FragmentManager correct, et tout semblait bien fonctionner ... avec une petite liste. Une fois que la liste des éléments a dépassé un peu la hauteur de l'écran, j'ai commencé à obtenir ce problème lors du défilement.

Il s'est avéré que c'était parce que j'injectais un SupportMapFragment dynamique à l'intérieur d'une vue, qui était à l'intérieur d'un autre fragment, pour contourner certains problèmes que je rencontrais lorsque j'essayais de le déclarer statiquement dans mon XML. De ce fait, la disposition de l'espace réservé au fragment n'a pu être remplacée par le fragment réel qu'une fois la vue attachée à la fenêtre, c'est-à-dire visible à l'écran. J'avais donc mis mon code pour initialiser le SupportMapFragment, faire le remplacement du fragment et appeler getMapAsync () dans l'événement onAttachedToWindow.

Ce que j'ai oublié de faire, c'est de m'assurer que mon code ne s'est pas exécuté deux fois. C'est-à-dire dans l'événement onAttachedToWindow, vérifiez si mon SupportMapFragment dynamique était toujours nul avant d'essayer d'en créer une nouvelle instance et de remplacer un fragment. Lorsque l'élément sort du haut de RecyclerView, il est détaché de la fenêtre, puis réattaché lorsque vous y faites défiler, de sorte que cet événement est déclenché plusieurs fois.

Une fois que j'ai ajouté la vérification nulle, cela ne s'est produit qu'une seule fois par article RecyclerView et le problème a disparu! TL; DR!

Breeno
la source
2

Cela se produit lorsque vous appelez à partir d'un fragment à l'intérieur d'un autre.

utilisation :

getActivity().getSupportFragmentManager().beginTransaction();
Arvin Sanaei
la source
1

J'ai rencontré ce problème lorsque j'ai essayé de remplacer la vue par mon fragment dans onCreateView(). Comme ça:

public class MyProjectListFrag extends Fragment {


    private MyProjectListFragment myProjectListFragment;

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

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();
    }

Ça m'a dit

11-25 14:06:04.848: E/AndroidRuntime(26040): java.lang.IllegalArgumentException: No view found for id 0x7f05003f (com.example.myays:id/container_for_my_pro_list) for fragment MyProjectListFragment{41692f40 #2 id=0x7f05003f myProjectListFragment}

J'ai ensuite résolu ce problème en mettant replace dans onActivityCreated(). Comme ça:

public class MyProjectListFrag extends Fragment {

    private final static String TAG = "lch";

    private MyProjectListFragment myProjectListFragment;

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

        return inflater
                .inflate(R.layout.frag_my_project_list, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();

    }
  1. Vous devez renvoyer une vue onCreateView()pour pouvoir la remplacer plus tard
  2. Vous pouvez placer n'importe quelle opération vers cette vue dans la fonction suivante dans le fragment liftcycle, comme onActivityCreated()

J'espère que cela t'aides!

Stephen Lin
la source
1

J'ai corrigé ce bug, j'utilise le commitNow()remplacement commit().

mFragment.getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.main_fragment_container,fragment)
  .commitNowAllowingStateLoss();

C'est commitNowune méthode de synchronisation, la commit()méthode est une méthode asynchrone.

user1232595
la source
1

Dans mon cas, cette exception a été levée lorsque j'ai utilisé différents identifiants pour le même élément de disposition (espace réservé de fragment) tout en en ayant plusieurs pour différentes variantes de build. Pour une raison quelconque, cela fonctionne parfaitement bien lorsque vous remplacez fragment pour la première fois, mais si vous essayez de le faire à nouveau, vous obtenez cette exception. Assurez-vous donc que vous utilisez le même identifiant si vous disposez de plusieurs dispositions pour différentes variantes de build.

TK
la source
0

Si vous essayez de remplacer un fragment dans un fragment par le fragmentManagermais vous ne gonflez pas le fragment parent qui peut provoquer un problème.

Dans BaseFragment.java OnCreateView :

if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new DifferentFragment())
                    .commit();
        }

return super.onCreateView(inflater, container, savedInstanceState);

Remplacez super.onCreateView(inflater, container, savedInstanceState); par gonfler la disposition correcte pour le fragment:

        return inflater.inflate(R.layout.base_fragment, container, false);
Stephen
la source
0

J'ai eu le même problème lors de la transaction de fragment lors de la création d'activité.

Le problème central est ce que Nick a déjà souligné - l'arbre de visualisation n'a pas encore été gonflé. Mais sa solution n'a pas fonctionné - la même exception dans onResume, onPostCreate etc.

La solution consiste à ajouter un rappel au fragment de conteneur pour signaler quand il est prêt:

public class MyContainerFragment extends Fragment {
    public static interface Callbacks {
        void onMyContainerAttached();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d(TAG, "--- onAttach");
        ((Callbacks) activity).onMyContainerAttached();
    }

    //... rest of code
}

Et puis en activité:

public class MainActivity extends Activity
        implements MyContainerFragment.Callbacks
{
    @Override
    public void onMyContainerAttached() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.containerFrame, new MyFragment())
                .commit();
    }

    //...
}
Alexander Malakhov
la source
0

Dans mon cas, j'utilisais un fichier de classe de fragment pour déclarer une classe d'adaptateur listview. Je viens d'utiliser un fichier différent pour la classe d'adaptateur public et l'erreur a disparu.

Gauss
la source
0

Ce problème se produit également lorsque vous ne mettez pas <include layout="@layout/your_fragment_layout"/>votreapp_bar_main.xml

Bbake Waikhom
la source
0

Cela se produit également lorsque vous avez deux vues en deux fragments avec les mêmes identifiants

Hossam Hassan
la source
Ceci est une erreur. Dans ce cas, le code ne serait même pas compilé.
Taslim Oseni
0

J'ai eu le même problème que cela a été causé parce que j'ai essayé d'ajouter des fragments avant d'ajouter la disposition du conteneur à l'activité.

Rohit
la source
0

Parfois, c'est parce que vous utilisez un BottomNavigationView. Si vous ouvrez une intention à partir de la navigation et que vous ouvrez un fragment dans cette activité, disons

transaction.replace(R.id.container,new YourFragment());

alors l'activité ne pourra pas trouver la méthode de navigation que vous utilisez.

SOLUTION: modifiez l'activité pour fragmenter et gérer la navigation avec addOnBackStack dans votre application. Si vous avez implémenté la navigation Jetpack, utilisez simplement des fragments dans votre projet.

Felipe Franco
la source
0

Dans mon cas. J'ai un Activityserveur avec un Fragmentcertain temps, j'ai besoin de recréerFragment s quand

  • la langue change
  • mise en page des fragments certains ont besoin d'autres pas ou le changement de contenu doit recréer
  • autres changements
  • J'efface tous les Fragments et je les mets tous nullen activité, mais Fragment se crée déjà lui-même, tandis que l'activité d'hôte est définie sur null, donc avant d'appeler la vue Fragment, vérifiez-la nulle

    par exemple

    Activity{
        fragment
        recreate{
           fragment = null then new instance
        }
    
    }
    
    Fragment{
        if((activity).fragment != null) {
           findViewById()
        }
    
    }
    shuabing
    la source