android.view.InflateException: fichier XML binaire: erreur de gonflement du fragment de classe

152

J'ai une erreur très frustrante que je ne peux pas expliquer. J'ai créé une application Android qui la Android AppCompatrend compatible avec les anciennes versions. Voici mon principal fichier de mise en page d'activité:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- android:layout_gravity="start" tells DrawerLayout to treat
         this as a sliding drawer on the left side for left-to-right
         languages and on the right side for right-to-left languages.
         If you're not building against API 17 or higher, use
         android:layout_gravity="left" instead. -->

    <!-- The drawer is given a fixed width in dp and extends the full height of
         the container. -->
    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.fragment.NavigationDrawerFragment" />

</android.support.v4.widget.DrawerLayout>

Et voici le code principal de mon activité:

public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   }
}

Le principal problème ici est le suivant: le code ci-dessus fonctionne correctement sur presque les appareils (appareil stimulé ou certains appareils réels). Mais quand je l'exécute sur Samsung S3. Il remarque cette erreur:

java.lang.RuntimeException: Unable to start activity ComponentInfo{view.MainActivity}: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
            at android.app.ActivityThread.access$700(ActivityThread.java:134)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4856)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316)
            at android.app.Activity.setContentView(Activity.java:1901)
            at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
            at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)

S'il vous plaît dites-moi comment corriger l'erreur, merci :)

hqt
la source
1
Dans cette ligne, vous obtenez une exception pour vérifier si le nom de la classe et le nom du package sont corrects ou non..android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
kalyan pvs
1
j'ai vérifié et cette classe est vraie. je peux compiler et exécuter sur certains appareils mais pas sur samsung s3. je pense que quelques problèmes étranges ici :(
hqt
vous avez raison s'il s'exécute sur un appareil et non sur s3, c'est un problème étrange ... mon conseil est d'essayer une fois d'utiliser sherlacFragment chek une fois ..
kalyan pvs
J'ai déjà résolu le problème ici: stackoverflow.com/a/33128448/4366715 .
daniel kilinskas
1
Pour ceux qui essaient de diagnostiquer la cause de cette erreur: les correctifs anecdotiques ici sont un hareng rouge. Il y a une exception précédente se produisant pendant le gonflage du fragment qui n'apparaît pas dans la trace de pile . Ça pourrait être n'importe quoi. Pour résoudre le problème, vous devez découvrir quelle est l'exception précédente. Pour ce faire, consultez ma réponse ou celle de @ DaveHubbard.
LarsH

Réponses:

126

Après une longue période de débogage, j'ai résolu ce problème. (Bien que je ne puisse toujours pas expliquer pourquoi). Que je change la propriété android:nameà class. (bien que sur Android Document, ils disent que ces propriétés sont les mêmes, mais cela fonctionne !!!)

Donc, cela devrait changer de:

 android:name="com.fragment.NavigationDrawerFragment"

à

class = "com.fragment.NavigationDrawerFragment"

Ainsi, la nouvelle mise en page devrait être:

<!-- As the main content view, the view below consumes the entire
     space available using match_parent in both dimensions. -->
<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     If you're not building against API 17 or higher, use
     android:layout_gravity="left" instead. -->

<!-- The drawer is given a fixed width in dp and extends the full height of
     the container. -->
<fragment android:id="@+id/navigation_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    class = "com.fragment.NavigationDrawerFragment" />

J'espère que cette aide :)

hqt
la source
4
J'ai rencontré ce problème en essayant de suivre le tutoriel officiel Android. Votre solution (changer android:iden class) a fonctionné pour moi. J'ai aussi reçu un avertissement Lint au changement Fragmentà fragmentce que je fis.
stevepastelan
9
@DownVoter: cette erreur est confuse. Et je trouve heureusement le moyen de le réparer. Je suis vraiment désolé si mon message ne peut pas corriger votre erreur car je ne peux pas non plus expliquer pourquoi. Mais je pense qu'il ne devrait pas recevoir un vote défavorable. :)
hqt
2
Je me demande si vous avez eu ce crash de manière fiable sans changer de nameà class, quelques utilisateurs ont signalé ce crash mais je ne peux pas le reproduire moi-même!
Daniel Wilson
8
Ça ne marche pas pour moi. Je suis si fatigué. 2h de dev et je ne trouve pas pourquoi cela ne fonctionne pas (ligne de fichier xml binaire ... fragment de classe gonflant d'erreur). Une idée ?
Cocorico
32

Je n'ai pas pu résoudre mon problème en utilisant les réponses fournies. Enfin j'ai changé ceci:

<fragment
android:id="@+id/fragment_food_image_gallery"
android:name="ir.smartrestaurant.ui.fragment.ImageGalleryFragment"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout="@layout/fragment_image_gallery"
tools:layout="@layout/fragment_image_gallery" />

pour ça :

<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="200dp" />

,

private void showGallery() {
    ImageGalleryFragment fragment = new ImageGalleryFragment()
    getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

et il fonctionne.
Si vous l'utilisez dans un fragment, utilisez getChildFragmentManager au lieu de getSupportFragmentManager .

ReZa
la source
31

TL / DR : Une exception s'est produite lors de la création d'un fragment référencé à partir d'un XML de mise en page de niveau supérieur. Cette exception a provoqué l'échec de l'inflation de mise en page de niveau supérieur, mais l'exception initiale n'a pas été signalée ; seul l'échec d'inflation de niveau supérieur apparaît dans la trace de pile. Pour trouver la cause première, vous devez attraper et enregistrer l'exception initiale .


La cause initiale de l'erreur pourrait être une grande variété de choses, c'est pourquoi il y a tant de réponses différentes ici quant à ce qui a résolu le problème pour chaque personne. Pour certains, il fallait faire avec les id, classou les nameattributs. Pour d'autres, cela était dû à un problème d'autorisations ou à un paramètre de construction. Pour moi, cela n'a pas résolu le problème; au lieu de cela, il y avait une ressource dessinable qui n'existait que dans drawable-ldrtl-xhdpi, au lieu de dans un endroit applicable comme drawable.

Mais ce ne sont que des détails. Le problème global est que le message d'erreur qui apparaît dans logcat ne décrit pas l'exception qui a tout déclenché. Lorsqu'un XML de mise en page de niveau supérieur référence un fragment, celui-ci onCreateView()est appelé. Lorsqu'une exception se produit dans un fragmentonCreateView() (par exemple lors du gonflement du XML de mise en page du fragment), cela provoque l'échec de l'inflation du XML de mise en page de niveau supérieur. Cet échec d'inflation de niveau supérieur est ce qui est signalé comme une exception dans les journaux d'erreur. Mais l'exception initiale ne semble pas remonter assez bien la chaîne pour être signalée.

Dans cette situation, la question est de savoir comment exposer l'exception initiale, lorsqu'elle n'apparaît pas dans le journal des erreurs.

La solution est assez simple: placez un bloc try/ catchautour du contenu du fragment onCreateView(), et dans la catchclause, enregistrez l'exception:

public View onCreateView(LayoutInflater inflater, ViewGroup contnr, Bundle savedInstSt) {
    try {
        mContentView = inflater.inflate(R.layout.device_detail_frag, null);
        // ... rest of body of onCreateView() ...
    } catch (Exception e) {
        Log.e(TAG, "onCreateView", e);
        throw e;
    }
}

Il n'est peut-être pas évident à quelle classe de fragment onCreateView()faire cela, auquel cas, faites-le à chaque classe de fragment utilisée dans la mise en page qui a causé le problème. Par exemple, dans le cas de l'OP, le code de l'application où l'exception s'est produite était

at android.app.Activity.setContentView(Activity.java:1901)

lequel est

   setContentView(R.layout.activity_main);

Vous devez donc intercepter les exceptions dans le onCreateView()de tous les fragments référencés dans la mise en page activity_main.

Dans mon cas, l'exception de cause première s'est avérée être

Caused by: android.content.res.Resources$NotFoundException: Resource
   "com.example.myapp:drawable/details_view" (7f02006f)  is not a
   Drawable (color or path): TypedValue{t=0x1/d=0x7f02006f a=-1
   r=0x7f02006f}

Cette exception n'apparaissait pas dans le journal des erreurs jusqu'à ce que je l'ai détectée onCreateView()et connectée explicitement. Une fois enregistré, le problème était assez facile à diagnostiquer et à résoudre (il details_view.xmln'existait que sous le ldrtl-xhdpidossier, pour une raison quelconque). La clé était de capturer l'exception qui était à l'origine du problème et de l'exposer.

Cela ne fait pas de mal de faire cela comme un passe- partout dans toutes les onCreateView()méthodes de vos fragments . S'il y a une exception non interceptée là-dedans, l'activité bloquera malgré tout. La seule différence est que si vous détectez et connectez l'exception onCreateView(), vous ne saurez pas pourquoi cela s'est produit.

PS Je viens de réaliser que cette réponse est liée à @ DaveHubbard, mais utilise une approche différente pour trouver la cause racine (journalisation vs débogueur).

LarsH
la source
2
Vous m'avez probablement sauvé des heures de débogage. Gloire!
Szymon Sadło
16

J'ai eu le même problème, problème, essayé toutes les réponses dans ce fil en vain. Ma solution était que je n'avais pas ajouté d'identifiant dans le XML d'activité. Je ne pensais pas que ce serait important, mais c'est vrai.

Donc, dans le XML d'activité, j'avais:

<fragment
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Mais j'aurais dû avoir:

<fragment
    android:id="@+id/some_fragment"
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Si quelqu'un serait heureux de dire pourquoi, je suis tout à fait à l'écoute des autres, j'espère que cela aide.

Roucouler
la source
1
Merci, cela a fonctionné pour moi. J'avais omis un identifiant depuis des mois, mais après quelques changements de mise en page, j'ai soudainement commencé à avoir ce crash. Android est bizarre.
erisco
Vous répondez fonctionne pour moi. Je me demande simplement pourquoi je suppose de mettre l'attribut id quand je ne l'utilise nulle part. Pouvez vous m'expliquer?
Moshii
12

Cela ne vous sera peut-être plus nécessaire, mais si d'autres lecteurs le trouvent utile. J'ai exactement la même chose android.view.InflateException:...Error inflating class fragment. J'avais toutes les bonnes bibliothèques incluses. Résolu en ajoutant une autorisation d'utilisateur supplémentaire dans le AndroidManifest.xmlfichier ie<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Btw je courais Android Studio 0.8.9 on Ubuntu 12.04.

Abu Shumon
la source
A travaillé pour moi! Merci beaucoup!
Dadan
12

J'ai le même problème car je n'ai pas implémenté l'auditeur. Voir le code suivant avec /*Add This!*/.

public class SomeActivity extends AppCompatActivity
        implements BlankFragment.OnFragmentInteractionListener /*Add this!*/ 
{
    @Override                                                  /*Add This!*/
    public void onFragmentInteraction(Uri uri){                /*Add This!*/
    }                                                          /*Add This!*/
}

FYI, ma classe de fragment est quelque chose comme ceci:

public class SomeFragment extends Fragment {

    private OnFragmentInteractionListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }
}

Éditer:

Je remarque également ce même message d'erreur dans d'autres circonstances lorsqu'il y a une exception dans la onCreatefonction du Fragment. J'ai quelque chose comme ceci:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    int ID = getArguments().getInt("val");

    return rootView;
} 

Parce que je réutilise ce fragment, j'oublie totalement de définir des arguments. Alors le résultat de getArguments()est null. De toute évidence, j'obtiens une nullexception de pointeur ici. Je vous suggère de garder un œil sur les erreurs comme celle-ci.

Yuchen Zhong
la source
1
Merci! Cela a beaucoup aidé!
DLee
8

Votre NavigationDrawerFragment étend-il le fichier android.support.v4.app.Fragment? En d'autres termes, importez-vous le bon package?

import android.support.v4.app.Fragment;
Wang
la source
6

J'ai aussi eu ce problème. Je l'ai résolu en remplaçant l'importation dans MainActivityetNavigationDrawerFragment

De

import android.app.Activity;
import android.app.ActionBar;

À

import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;

J'ai mis MainActivityà jour les extensions ActionBarActivityau lieu de l'activité

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

Utilisez également ActionBar actionBar = getSupportActionBar();pour obtenir l'ActionBar

Et j'ai mis à jour la fonction suivante dans NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
Fr4nz
la source
Je pense que c'est la bonne réponse. Mais j'ai utilisé AppCompatActivity au lieu d'ActionBarActivity (non obsolète) et je ne supprime pas non plus l'importation android.app.ActionBar (comme la méthode onAttach l'utilise)
GramThanos
6

J'ai fait face à ce problème et l'ai résolu en utilisant les codes suivants. Je commençais une transaction de fragment en utilisant le gestionnaire de fragments d'enfant.

disposition:

                  <fragment
                    class="com.google.android.youtube.player.YouTubePlayerSupportFragment"
                    android:id="@+id/youtube_fragment"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

voici comment j'ai commencé la transaction fragmentée:

   youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

les codes suivants expliquent comment j'ai supprimé le fragment ajouté à l'aide de childfragmentmanger.

@Override
    public void onDestroyView() {
        super.onDestroyView();

        youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

        if (youTubePlayerFragment != null)
        {
            getChildFragmentManager().beginTransaction().remove(youTubePlayerFragment).commitAllowingStateLoss();
        }

        youTubePlayer = null;
    }
Ali Gürelli
la source
TY Ali. Tu as sauvé ma journée!
vm345
Fonctionne très bien. Je vous remercie!
Polyariz
4

J'ai eu des problèmes similaires de temps en temps. Le message d'erreur fournit souvent très peu de détails, quelle que soit la cause réelle. Mais j'ai trouvé un moyen d'obtenir des informations plus utiles. Il s'avère que la classe android interne 'LayoutInflater.java' (dans le package android.view) a une méthode 'inflate' qui relance une exception, mais ne récupère pas les détails, vous perdez donc des informations sur la cause.

J'ai utilisé AndroidStudio et défini un point d'arrêt à la ligne 539 de LayoutInflator (dans la version dans laquelle je travaille), qui est la première ligne du bloc catch pour une exception générique dans cette méthode `` gonfler '':

        } catch (Exception e) {
            InflateException ex = new InflateException(
                    parser.getPositionDescription()
                            + ": " + e.getMessage());
            ex.initCause(e);
            throw ex;

Si vous regardez «e» dans le débogueur, vous verrez un champ «cause». Cela peut être très utile pour vous donner une idée de ce qui s'est réellement passé. C'est ainsi, par exemple, que j'ai constaté que le parent d'un fragment inclus doit avoir un identifiant, même s'il n'est pas utilisé dans votre code. Ou qu'un TextView avait un problème avec une dimension.

Dave Hubbard
la source
3

Juste au cas où quelqu'un en aurait besoin. Hypothèses: le téléphone de l'appareil est connecté au câble USB et votre lecture IDE pour lancer l'application. Accédez à l'invite de commande pour déterminer le problème: entrez adb logcat

Ensuite, lancez votre application depuis l'IDE. Vous serez une exception.

Dans mon cas: je déployais une application Android de la version 2.3 sur un appareil mobile qui ne prenait pas en charge le widget "Espace"

al881
la source
3

Ce problème survient lorsque vous avez une classe personnalisée qui étend une classe différente (dans ce cas, une vue) et n'importe pas tous les constructeurs requis par la classe.

Par exemple: la classe publique CustomTextView étend TextView {}

Cette classe aurait 4 constructeurs et si vous en manquiez un, il planterait. En fait, j'ai raté le dernier qui a été utilisé par Lollipop a ajouté ce constructeur et a bien fonctionné.

Sagar Devanga
la source
2

nous devons également ajouter des éléments suivants dans build.gradle (app)

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

chaque fois que nous utilisons de nouvelles mises en page ou de nouvelles fonctionnalités de conception. j'espère que cela vous aide.

Uma Achanta
la source
2

Comme mentionné dans un article précédent,
renommez

android:name="com.fragment.NavigationDrawerFragment"

à

class = "com.fragment.NavigationDrawerFragment"

Pourtant, cela n'a pas fonctionné pour moi. J'ai ensuite juste utilisé le nom de la classe sans la partie com.fragment et voilà, cela a fonctionné. Alors changez-le enfin en

class = "NavigationDrawerFragment"
flo ouest
la source
2

Après qu'aucune des réponses ici ne m'a aidé, j'ai choisi d'exécuter l'application en mode débogage en se déplaçant sur chaque ligne de onCreateView dans mon fragment (NavigationDrawerFragment dans votre cas). Et j'ai remarqué que le fragment avait du mal à se gonfler à cause d'une NullPointerException. Par exemple

mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
mySeekBar.setOnSeekBarChangeListener(this);

Ici, mySeekBar a été défini sur null (car j'avais manqué d'ajouter le contrôle dans la disposition appropriée) et la ligne suivante est entrée dans NPE qui est sortie comme InflateException. De plus, comme suggéré ci-dessus, renommez android: nom en classe.

Ce problème peut survenir pour diverses raisons mentionnées ci-dessus. Je recommanderais un flux de débogage ligne par ligne pour savoir ce qui ne va pas.

Vishy
la source
Et cette erreur s'est-elle produite dans la onCreateView()méthode d' un fragment ?
LarsH
1

Pour certains d'entre vous qui n'ont toujours pas trouvé de solution à cela, dans mon cas, cela se produisait parce que j'avais un problème de MOO (mémoire insuffisante). Cela peut se produire lorsque vous avez par exemple une fuite de mémoire dans votre application lorsque vous l'utilisez pendant une longue période. Dans ma trace de pile, c'était la raison principale.

Sam Bellerose
la source
1

Je ne sais pas si cela aidera.

J'ai eu ce problème avec un TextView que j'avais dans la mise en page que j'essayais de gonfler ( android.view.InflateException: ligne de fichier XML binaire # 45: erreur de gonflage de la classe TextView ).

J'avais défini l'attribut XML suivant android: textSize = "? Android: attr / textAppearanceLarge" qui ne permettait pas de gonfler la mise en page.

Je ne sais pas exactement pourquoi, ( je suis encore un peu nouveau sur Android - moins d'un an d'expérience ), cela pourrait avoir quelque chose à voir avec l'appel d'attributs système, idk, tout ce que je sais, c'est dès que j'ai utilisé le vieux @ dimen / md_text_16sp ( qui est une de mes coutumes ), problème résolu :)

J'espère que cela t'aides...

tl_
la source
Je n'avais aucun fragment ni attribut android textSize. Mon erreur a été liée à un TextInputLayout avec un style personnalisé héritant TextAppearance.AppCompat au lieu de Widget.Design.TextInputLayout:. stackoverflow.com/questions/19874882/…
Junior Mayhé
1

J'avais cela sur un appareil 4.4.2, mais 5+ était bien. La cause: lors de l'initialisation d'une vue personnalisée, je créais un TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes), qui est l'API 21+.

Android Studio 2.1 ne s'en plaint pas même s'il est annoté TargetApi(21). Apparemment, Android Studio 2.2 corrigera cela et l'affichera correctement comme une erreur.

J'espère que cela aide quelqu'un.

À M
la source
1

Je suis un peu en retard à la fête mais aucune de ces réponses m'a aidé dans mon cas. J'utilisais Google map comme SupportMapFragment et PlaceAutocompleteFragment tous deux dans mon fragment. Comme toutes les réponses ont souligné le fait que le problème est que SupportMapFragment est la carte à recréer et à redessiner.

Mais j'ai aussi eu un problème avec PlaceAutocompleteFragment. Voici donc la solution de travail pour ceux qui sont confrontés à ce problème à cause de SupportMapFragment et SupportMapFragment

 mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    FragmentManager fm = getChildFragmentManager();

    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit();
        fm.executePendingTransactions();
    }

    mapFragment.getMapAsync(this);

    //Global PlaceAutocompleteFragment autocompleteFragment;


    if (autocompleteFragment == null) {
        autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment);

    }

Et dans onDestroyView, effacez SupportMapFragment et SupportMapFragment

@Override
public void onDestroyView() {
    super.onDestroyView();


    if (getActivity() != null) {
        Log.e("res","place dlted");
        android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();
        android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(autocompleteFragment);
        fragmentTransaction.commit();

        autocompleteFragment = null;
    }


}
Ratul Bin Tazul
la source
1

Après de longs essais, c'est ainsi que j'ai résolu le problème alors qu'aucune des réponses ci-dessus ne le pouvait.

  1. Prolongez AppCompatActivityvotre Mainactivité au lieu de Activity.
  2. Ajoutez android:theme="@style/Theme.AppCompat.Light"à votre <Activity..../>dans leAndroidManifest.xml
  3. Dans votre NavigationDrawerFragmentclasse, modifiez vos ActionBarinstances en

    ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar();

ÉDITER

Cela devrait être une cohérence entre l' activité et la mise en page . Si la mise en page a l'un des thèmes AppCompat tels que Theme.AppCompat.Light, votre activité devrait extends AppCompatActivity.

Je voulais avoir l' icône du hamburger et un tiroir de navigation qui ressemble à l' application Android Gmail , mais je me suis retrouvé avec un vilain tiroir de navigation . Tout ça parce que toutes mes classes extends Activityau lieu de AppCompatActivity.

J'ai retravaillé l'ensemble du projet pour l'étendre AppCompatActivity, puis Clic droit sur le Layout Folder, choisi new-> Activitypuis Navigation Drawer Activityet Boom, tout est fait pour moi!

Yahya
la source
1
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar

La vue peut être tout ce qui ne parvient pas à être gonflé, ce type d'erreur survient lorsqu'il y a un conflit dans la résolution des noms de classe ou de l'attribut de nom d'une vue référencée dans le fichier XML.

Quand j'obtiens la même erreur, je viens de tout nettoyer et en toute sécurité dans le fichier UI-XML, la vue que j'utilisais,

   <com.google.android.material.bottomappbar.BottomAppBar
    android:id="@+id/bottomAppBar"
    style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:hideOnScroll="true"
    app:menu="@menu/bottom_app_bar"
    app:navigationIcon="@drawable/ic__menu_24"/>

J'utilisais un attribut de style qui faisait référence à la propriété des composants matériels. Mais mon styles.xml avait ...

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>

Là où la classe résolvant faisait face au conflit. Mes attributs de vue faisaient référence à une propriété qui n'était pas définie dans le thème de mon application. Le bon thème parent des composants matériels m'a aidé. J'ai donc changé l'attribut parent en ...

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>

Ce qui a résolu le problème.

Shrinivas Manjithaya
la source
0

Je pense que le problème de base est avec "android: targetSdkVersion" qui est défini dans AndroidManifest.xml. Dans mon cas, la valeur initiale que j'ai définie comme:

android:targetSdkVersion=16

Je l'ai changé en:

android:targetSdkVersion=22

qui a résolu ma toute l'erreur. Ainsi, la configuration de la bonne «targetSdkVersion» est également importante avant de créer une application Android.

Sanjeev
la source
0

Au cas où quelqu'un d'autre viendrait ici et que les réponses n'aideraient pas à résoudre le problème, une dernière chose à essayer.

Comme d'autres l'ont mentionné, cela est généralement causé par un problème imbriqué dans le XML lui-même, par opposition à quelque chose que vous avez mal fait dans votre Java. Dans mon cas, c'était une erreur super facile (et stupide) à corriger.

J'avais un code comme celui-ci:

<view
    android:layout_width="fill_parent"
    android:layout_height="1dip"
    android:id="@+id/view44"
    android:background="@color/gray"
    />

Quand tout ce que j'avais à faire était de mettre en majuscule le v dans 'View' pour que le système le reconnaisse. Vérifiez que vos vues personnalisées (ou fragments, recyclerviews, etc.) ont toutes la déclaration en majuscules appropriée à l'avance afin que la saisie automatique XML corresponde à la vue appropriée.

PGMacDesign
la source
0

J'ai eu cette erreur aussi, et après un très long débogage, le problème s'est avéré être que mon activité étendue MainClass au lieu de FrameActivity, dans mon cas, le xml n'était pas un problème. J'espère vous aider.

Copacel
la source
0

Dans mon cas .

La disposition que j'essayais de gonfler avait

<include 
 layout  = "...."
/>

tag, le retirer l'a corrigé.

J'essayais de gonfler une mise en page précédente conçue pour un Actvity dans l'adaptateur view-pager.

mughil
la source
0

Mon erreur a été causée par un problème différent.

Je passais un paquet d'une activité à son fragment. Lorsque j'ai commenté le code recevant le paquet dans le fragment, l'erreur avait disparu. En fait, mon erreur était due au "getArguments ();" ci-dessous; partie qui retournait null.

Bundle args = getArguments();

En vérifiant le code d'envoi de l'activité, j'ai réalisé que j'avais une erreur stupide dans ce qui suit;

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 FragmentManager fragmentManager = getSupportFragmentManager();
 --> fragmentManager.beginTransaction()
                        .replace(R.id.container, new  MainActivityFragment(),
                                DetailRecipeActivityFragment.TAG)
                        .commit();

Je créais un NOUVEAU fragment dans la ligne avec la flèche. Alors que j'aurais dû utiliser le fragment pré-instancié qui avait déjà mon bundle. Donc ça aurait dû être:

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 Fragment mainFragment = new MainActivityFragment();
 FragmentManager fragmentManager = getSupportFragmentManager();
 -->fragmentManager.beginTransaction()
                        .replace(R.id.container, mainFragment,
                                DetailRecipeActivityFragment.TAG)
                        .commit();

Je ne sais pas pourquoi exactement cela génère cette erreur au lieu d'un NPE, mais cela a résolu mon erreur au cas où quelqu'un aurait le même scénario

Amgad
la source
0

J'avais le même problème, dans mon cas, le nom du paquet était incorrect, le réparer a résolu le problème.

Tincho825
la source
0

J'ai eu cette erreur lorsque j'avais mon RecyclerView à la racine de mon fragment.xml,

mais quand je l'ai enveloppé avec un ViewGroup, l'application fonctionnait bien.

7odafarghal
la source
0

Ajouter ce champ de nom dans la navigation

android: name = "androidx.navigation.fragment.NavHostFragment"

   <fragment
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:name="androidx.navigation.fragment.NavHostFragment"
             app:navGraph="@navigation/navigation"
             app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
             app:layout_constraintTop_toTopOf="parent">
jai khambhayta
la source