J'ai une erreur très frustrante que je ne peux pas expliquer. J'ai créé une application Android qui la Android AppCompat
rend 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 :)
Réponses:
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:
à
Ainsi, la nouvelle mise en page devrait être:
J'espère que cette aide :)
la source
android:id
enclass
) a fonctionné pour moi. J'ai aussi reçu un avertissement Lint au changementFragment
àfragment
ce que je fis.name
àclass
, quelques utilisateurs ont signalé ce crash mais je ne peux pas le reproduire moi-même!Je n'ai pas pu résoudre mon problème en utilisant les réponses fournies. Enfin j'ai changé ceci:
pour ça :
,
et il fonctionne.
Si vous l'utilisez dans un fragment, utilisez getChildFragmentManager au lieu de getSupportFragmentManager .
la source
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
,class
ou lesname
attributs. 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 dansdrawable-ldrtl-xhdpi
, au lieu de dans un endroit applicable commedrawable
.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
/catch
autour du contenu du fragmentonCreateView()
, et dans lacatch
clause, enregistrez l'exception: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 étaitlequel est
Vous devez donc intercepter les exceptions dans le
onCreateView()
de tous les fragments référencés dans la mise en pageactivity_main
.Dans mon cas, l'exception de cause première s'est avérée être
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 (ildetails_view.xml
n'existait que sous leldrtl-xhdpi
dossier, 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'exceptiononCreateView()
, 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).
la source
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:
Mais j'aurais dû avoir:
Si quelqu'un serait heureux de dire pourquoi, je suis tout à fait à l'écoute des autres, j'espère que cela aide.
la source
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 leAndroidManifest.xml
fichier ie<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Btw je courais
Android Studio 0.8.9 on Ubuntu 12.04.
la source
J'ai le même problème car je n'ai pas implémenté l'auditeur. Voir le code suivant avec
/*Add This!*/
.FYI, ma classe de fragment est quelque chose comme ceci:
Éditer:
Je remarque également ce même message d'erreur dans d'autres circonstances lorsqu'il y a une exception dans la
onCreate
fonction duFragment
. J'ai quelque chose comme ceci:Parce que je réutilise ce fragment, j'oublie totalement de définir des arguments. Alors le résultat de
getArguments()
estnull
. De toute évidence, j'obtiens unenull
exception de pointeur ici. Je vous suggère de garder un œil sur les erreurs comme celle-ci.la source
Votre NavigationDrawerFragment étend-il le fichier android.support.v4.app.Fragment? En d'autres termes, importez-vous le bon package?
la source
J'ai aussi eu ce problème. Je l'ai résolu en remplaçant l'importation dans
MainActivity
etNavigationDrawerFragment
De
À
J'ai mis
MainActivity
à jour les extensionsActionBarActivity
au lieu de l'activitéUtilisez également
ActionBar actionBar = getSupportActionBar();
pour obtenir l'ActionBarEt j'ai mis à jour la fonction suivante dans
NavigationDrawerFragment
la source
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:
voici comment j'ai commencé la transaction fragmentée:
les codes suivants expliquent comment j'ai supprimé le fragment ajouté à l'aide de childfragmentmanger.
la source
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 '':
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.
la source
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"
la source
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é.
la source
nous devons également ajouter des éléments suivants dans build.gradle (app)
chaque fois que nous utilisons de nouvelles mises en page ou de nouvelles fonctionnalités de conception. j'espère que cela vous aide.
la source
Comme mentionné dans un article précédent,
renommez
à
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
la source
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
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.
la source
onCreateView()
méthode d' un fragment ?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.
la source
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...
la source
Widget.Design.TextInputLayout
:. stackoverflow.com/questions/19874882/…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.
la source
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
Et dans onDestroyView, effacez SupportMapFragment et SupportMapFragment
la source
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.
AppCompatActivity
votreMain
activité au lieu deActivity
.android:theme="@style/Theme.AppCompat.Light"
à votre<Activity..../>
dans leAndroidManifest.xml
Dans votre
NavigationDrawerFragment
classe, modifiez vosActionBar
instances enÉ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é devraitextends 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 Activity
au lieu deAppCompatActivity
.J'ai retravaillé l'ensemble du projet pour l'étendre
AppCompatActivity
, puis Clic droit sur leLayout Folder
, choisinew
->Activity
puisNavigation Drawer Activity
et Boom, tout est fait pour moi!la source
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,
J'utilisais un attribut de style qui faisait référence à la propriété des composants matériels. Mais mon styles.xml avait ...
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 ...
Ce qui a résolu le problème.
la source
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.
la source
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:
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.
la source
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.
la source
Dans mon cas .
La disposition que j'essayais de gonfler avait
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.
la source
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.
En vérifiant le code d'envoi de l'activité, j'ai réalisé que j'avais une erreur stupide dans ce qui suit;
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:
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
la source
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.
la source
Ouvrez le gradle.properties et ajoutez la ligne suivante:
Référence: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808
la source
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.
la source
Ajouter ce champ de nom dans la navigation
la source