android.view.InflateException: fichier XML binary: erreur lors du gonflage du fragment de classe

J’ai une erreur très frustrante que je ne peux pas expliquer. J’ai créé une application Android qui utilise Android AppCompat pour le rendre compatible avec les anciennes versions. Voici mon fichier de mise en forme d’activité principale:

        

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 est le suivant: le code ci-dessus fonctionne sans problème sur presque tous 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 🙂

Après un long moment de débogage, j’ai résolu ce problème. (Bien que je ne puisse toujours pas expliquer pourquoi). Que je change de propriété android:name en class . (bien que sur Android Document, ils disent que ces propriétés sont les mêmes, mais ça marche !!!)

Donc, il devrait changer de:

  android:name="com.fragment.NavigationDrawerFragment" 

à

 class = "com.fragment.NavigationDrawerFragment" 

Donc, la nouvelle mise en page devrait être:

      

J’espère que cette aide 🙂

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

  

pour ça :

  

,

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

et il fonctionne.
Si vous l’utilisez à l’intérieur de fragment, utilisez getChildFragmentManager au lieu de getSupportFragmentManager .

Ce n’est peut-être plus nécessaire pour vous, mais si d’autres lecteurs le trouvent utile. J’ai exactement le même android.view.InflateException:...Error inflating class fragment . J’avais toutes les bonnes bibliothèques incluses. Résolu en ajoutant une autorisation utilisateur supplémentaire dans le fichier AndroidManifest.xml , à savoir

Btw J’exécutais Android Studio 0.8.9 on Ubuntu 12.04.

J’ai eu le même problème, question, essayé toutes les réponses dans ce fil en vain. Ma solution était, je n’avais pas ajouté d’identifiant dans l’activité XML. Je ne pensais pas que cela importerait, mais c’était le cas.

Donc, dans l’activité XML, j’avais:

  

Mais aurait dû avoir:

  

Si quelqu’un était heureux de dire pourquoi, je suis tout ouïe, à d’autres, j’espère que cela aidera.

J’ai le même problème parce que 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!*/ } 

Pour info, ma classe de fragment ressemble à ce qui suit:

 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.toSsortingng() + " must implement OnFragmentInteractionListener"); } } public interface OnFragmentInteractionListener { public void onFragmentInteraction(Uri uri); } } 

Modifier:

Je remarque également ce même message d’erreur dans d’autres circonstances lorsqu’il existe une exception dans la fonction onCreate 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. Le résultat de getArguments() est alors null . De toute évidence, je reçois une exception de pointeur null ici. Je vous suggère de garder un œil sur les erreurs comme celle-ci.

Votre NavigationDrawerFragment étend-il le fragment android.support.v4.app.Fragment? En d’autres termes, importez-vous le bon paquet?

 import android.support.v4.app.Fragment; 

J’ai aussi eu ce problème. Je l’ai résolu en remplaçant l’importation dans MainActivity et NavigationDrawerFragment

De

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

À

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

J’ai mis à jour MainActivity pour étendre ActionBarActivity au lieu de Activity

 public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks 

Utilisez également ActionBar actionBar = getSupportActionBar(); pour obtenir la barre d’action

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

 private ActionBar getActionBar() { return ((ActionBarActivity)getActivity()).getSupportActionBar(); } 

TL / DR : une exception s’est produite lors de la création d’un fragment référencé à partir d’un XML de présentation de niveau supérieur. Cette exception a provoqué l’échec de l’inflation d’agencement de niveau supérieur, mais l’exception initiale n’a pas été signalée . Seule l’échec d’inflation de niveau supérieur apparaît dans la trace de la stack. Pour trouver la cause première, vous devez intercepter 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 tellement de réponses différentes à ce qui a résolu le problème pour chaque personne. Pour certains, cela concernait les atsortingbuts id , class ou name . Pour d’autres, cela était dû à un problème de permissions ou à un paramètre de construction. Pour moi, ceux-ci n’ont pas résolu le problème; au lieu de cela, il y avait une ressource pouvant être dessinée qui n’existait que dans drawable-ldrtl-xhdpi , plutôt que dans un endroit applicable comme drawable .

Mais ce ne sont que des détails. Le problème général 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, onCreateView() du fragment est appelé. Lorsqu’une exception se produit dans le onCreateView() un fragment (par exemple, pendant le gonflage du onCreateView() XML de mise en page du fragment), le gonflage du onCreateView() XML de mise en page de niveau supérieur échoue. Ce problème d’inflation de niveau supérieur est ce qui est signalé comme une exception dans les journaux d’erreurs. Mais l’exception initiale ne semble pas aller assez haut dans la chaîne pour être signalée.

Compte tenu de cette situation, la question est de savoir comment exposer l’exception initiale, si elle ne figure pas dans le journal des erreurs.

La solution est assez simple: placez un bloc try / catch autour du contenu du fragment onCreateView() et dans la clause catch , connectez-vous à 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 de savoir à quelle classe onCreateView() de fragment doit faire cela, auquel cas faites-le dans 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 onCreateView() de tous les fragments référencés dans layout activity_main .

Dans mon cas, l’exception de cause racine 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 ne s’est pas onCreateView() dans le journal des erreurs tant que je ne l’ai pas onCreateView() dans onCreateView() et que je l’ai enregistré explicitement. Une fois qu’il a été connecté, le problème était assez facile à diagnostiquer et à corriger ( details_view.xml n’existait que sous le dossier ldrtl-xhdpi , pour une raison quelconque). La clé capturait l’exception qui était la racine du problème et l’exposait.

Cela ne fait pas de mal de le faire en tant que passe- partout dans toutes les méthodes onCreateView() vos fragments. S’il existe une exception non interceptée, l’activité se bloquera indépendamment. La seule différence est que si vous attrapez et enregistrez l’exception dans onCreateView() , vous ne serez pas dans le noir pour savoir pourquoi.

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

J’ai eu des problèmes similaires sur et en dehors. Le message d’erreur fournit souvent très peu de détails, indépendamment de la cause réelle. Mais j’ai trouvé un moyen d’obtenir plus d’informations utiles. Il s’avère que la classe android interne ‘LayoutInflater.java’ (dans le package android.view) a une méthode de ‘gonflement’ qui renvoie 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 LayoutInflator 539 (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é. Voici comment, par exemple, j’ai trouvé 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 a un problème avec une dimension.

Juste au cas où quelqu’un aurait besoin de ça. Hypothèses: Le téléphone de l’appareil 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

Puis lancez votre application depuis l’IDE. Vous ferez une exception.

Dans mon cas: je déployais une application Android de la version 2.3 sur un appareil mobile qui ne supportait pas le widget “Space”

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 requirejs par la classe.

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

Cette classe aurait 4 constructeurs et si vous en manquez un, celui-ci tomberait en panne. En fait, j’ai manqué le dernier qui a été utilisé par Lollipop a ajouté ce constructeur et a bien fonctionné.

J’ai fait face à ce problème et l’ai résolu en utilisant les codes suivants. Je commençais à fragmenter les transactions en utilisant le gestionnaire de dossiers enfants.

disposition:

   

c’est comme ça que j’ai commencé la transaction de fragment:

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

Les codes suivants expliquent comment j’ai enlevé le fragment ajouté en utilisant 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; } 

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

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

chaque fois que nous utilisons de nouvelles dispositions ou de nouvelles fonctionnalités de conception. J’espère que cela vous aidera.

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

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

Ici, mySeekBar a été défini sur null (parce que je n’avais pas ajouté le contrôle dans la mise en page appropriée) et la ligne suivante est entrée dans NPE qui est sorti sous la forme InflateException. Aussi, comme suggéré ci-dessus, renommez Android: nom en classe.

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

Je ne sais pas si cela va aider.

J’ai eu ce problème avec un TextView dans la mise en page que j’essayais de gonfler ( android.view.InflateException: Ligne du fichier XML binary # 45: Erreur lors du gonflage de la classe TextView ).

J’avais défini l’atsortingbut XML suivant : 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 ), je pourrais avoir quelque chose à voir avec les atsortingbuts du système d’appel, idk, tout ce que je sais dimen / md_text_16sp ( qui est une de mes coutumes ), problème résolu 🙂

J’espère que cela t’aides…

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

Mais j’ai aussi eu un problème avec PlaceAutocompleteFragment. Donc, voici la solution de travail pour ceux qui sont confrontés à ce problème grâce à 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 effacer le 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; } } 

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 est la suivante:

android:targetSdkVersion=16

Je l’ai changé pour:

android:targetSdkVersion=22

ce qui a résolu toutes mes erreurs. Ainsi, la mise en place de la “targetSdkVersion” correcte est également importante avant de créer une application Android.

Si quelqu’un d’autre vient ici et que les réponses ne permettent pas de résoudre le problème, une autre chose à essayer.

Comme d’autres l’ont mentionné, cela est généralement dû à un problème nested 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:

  

Quand tout ce que je devais 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 majuscule appropriée à l’avant afin que le remplissage automatique XML corresponde à la vue appropriée.

Pour certains d’entre vous qui n’ont toujours pas trouvé de solution, dans mon cas, cela se produisait parce que j’avais un problème de MOO (Out of Memory). 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 stack, c’était la raison principale.

Je l’ai eu sur un appareil 4.4.2, mais 5+ était bien. La cause: dans l’initialisation d’une vue personnalisée, je TextView(Context context, AtsortingbuteSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) un TextView(Context context, AtsortingbuteSet 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 le montrera correctement comme une erreur.

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

J’ai eu cette erreur aussi, et après un très long débogage, le problème était que mon MainClass étendait l’activité au lieu de FrameActivity, dans mon cas, le xml n’était pas un problème. En espérant vous aider

Comme mentionné dans un post précédent,
Renommer

 android:name="com.fragment.NavigationDrawerFragment" 

à

 class = "com.fragment.NavigationDrawerFragment" 

Pourtant, cela n’a pas fonctionné pour moi. J’ai ensuite utilisé le nom de classe sans la partie com.fragment et le tour est joué. Alors changez-le enfin en

 class = "NavigationDrawerFragment" 

Dans mon cas .

La disposition que j’essayais de gonfler avait

  

tag, en le supprimant réparé.

J’essayais de gonfler une mise en page précédente conçue pour une Actvity dans l’adaptateur visionneur.

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 bundle dans le fragment, l’erreur avait disparu. En fin de compte, mon erreur était due au “getArguments ();” partie qui revenait nulle.

 Bundle args = getArguments(); 

Après avoir vérifié le code d’envoi d’activité, je me suis rendu compte que j’avais commis une erreur stupide dans le texte ci-dessous.

 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 paquet. 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 cette erreur jette 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

J’avais le même problème, dans mon cas, le nom du paquet était faux, le problème résolu.

Après une longue période d’essais, c’est ainsi que j’ai résolu le problème après qu’aucune des réponses ci-dessus n’a pu le faire.

  1. Étendez AppCompatActivity pour votre activité Main au lieu de l’ Activity .
  2. Ajouter android:theme="@style/Theme.AppCompat.Light" à votre dans le AndroidManifest.xml
  3. Dans votre classe NavigationDrawerFragment , remplacez vos instances ActionBar par

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

MODIFIER

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

Je voulais avoir l’icône du burger et un tiroir de navigation qui ressemble à l’ application Android Gmail , mais j’ai fini avec un tiroir de navigation moche. Tout cela parce que toutes mes classes extends Activity au lieu de AppCompatActivity .

J’ai refait le projet entier pour étendre AppCompatActivity , puis cliquez avec le AppCompatActivity droit de la AppCompatActivity sur le Layout Folder , choisissez new -> Activity puis Navigation Drawer Activity et Boom, tout est fait pour moi!

Ouvrez le fichier gradle.properties et ajoutez la ligne suivante:

 android.enableAapt2=false 

Référence: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808