web-dev-qa-db-fra.com

Erreur de gonflage du fragment de classe

Je reçois l'erreur 

Unable to start activity ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}: Android.view.InflateException: Binary XML file line #11: Error inflating class fragment

quand je commute via le mode portrait et le mode paysage. J'utilise des fragments. Mon xml est:

 <LinearLayout Android:id="@+id/mainLayout"
               Android:orientation="horizontal"
               Android:layout_width="fill_parent"
               Android:layout_height="wrap_content" >

    <ListView Android:id="@+id/Android:list"
              Android:layout_height="wrap_content"
              Android:layout_width="fill_parent"/> 

    <fragment Android:id="@+id/fragmentDetails"
              Android:layout_height="fill_parent"
              Android:layout_width="fill_parent"
              class="de.androidbuch.activiti.task.TaskDetailsFragment"/> 
</LinearLayout>

Si je passe en mode paysage et portrait tout fonctionne correctement. Mais lorsque je clique sur mon fragment (et que je peux voir mon fragment), puis que je passe à l’autre mode, le message s’affiche. Une idée de comment je peux le résoudre? J'ai trouvé des réponses ici mais aucune d'entre elles ne m'a aidé ...

06-21 14:55:05.600: ERROR/AndroidRuntime(7636): FATAL EXCEPTION: main
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): Java.lang.RuntimeException: Unable to start activity         
ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}:   Android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1736)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1752)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.ActivityThread.handleRelaunchActivity(ActivityThread.Java:3097)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.ActivityThread.access$1600(ActivityThread.Java:123)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:997)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.os.Handler.dispatchMessage(Handler.Java:99)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.os.Looper.loop(Looper.Java:126)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.ActivityThread.main(ActivityThread.Java:3998)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Java.lang.reflect.Method.invokeNative(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Java.lang.reflect.Method.invoke(Method.Java:491)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:841)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:599)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at dalvik.system.NativeStart.main(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): Caused by: Android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:688)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:724)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:727)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.view.LayoutInflater.inflate(LayoutInflater.Java:479)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.view.LayoutInflater.inflate(LayoutInflater.Java:391)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.view.LayoutInflater.inflate(LayoutInflater.Java:347)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.Android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.Java:227)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.Activity.setContentView(Activity.Java:1771)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at de.androidbuch.activiti.task.TaskActivity.onCreate(TaskActivity.Java:83)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1048)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1700)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     ... 12 more
142
tsync

Comme hdemirchian a dit, assurez-vous d'utiliser:

import Android.support.v4.app.Fragment;

Et assurez-vous également que l’activité qui utilise le (s) fragment (s) étend (e) FragmentActivity au lieu de la Activity régulière, 

import Android.support.v4.app.FragmentActivity;

pour obtenir la classe FragmentActivity

121
Dandre Allison

L'exception Android.view.InflateException: Binary XML file line: #... Error inflating class fragment peut se produire si vous manipulez avec getActivity() dans votre fragment avant que onActivityCreated() ne soit appelé. Dans ce cas, vous recevez une référence d'activité erronée et vous ne pouvez pas compter sur elle.

Par exemple, le motif suivant est faux:

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

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...); - another problem: button is null

    return view;
}

Correct pattern # 1

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

    Button button = view.findViewById(R.id...);
    button.setOnClickListener(...);

    return view;
}

Modèle correct n ° 2

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...);
}
88
Grigori A.

Assurez-vous que votre Activity prolonge FragmentActivity.

52
binnyb

J'ai eu la même erreur. Je creusais toute la journée, mais je pense que j’ai essayé environ 25 solutions à ce problème. Aucun n'a travaillé jusqu'à 2 heures du matin. J'ai découvert qu'il me manquait cette ligne dans le fichier manifeste d'Apps xml:

<meta-data Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" />

Cette ligne était à l'intérieur de la balise <application>. J'espère vraiment que cela aidera quelqu'un . GL.

30
Matiss Jurgelis

J'ai eu le même problème. La solution pour moi était l'ordre de super.onCreate et de setContentView dans FragmentActivity.

L'ordre suivant fonctionne bien: 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);
22
Wilko

J'avais le même problème que vous… .. Aucun des conseils mentionnés ci-dessus ne m'a aidé… .. Plus tard, j'ai découvert qu'il ne me restait plus qu'à réparer mes importations:

import Android.app.Fragment;

à:

import Android.support.v4.app.Fragment;
16
hdemirchian

Les fragments ne peuvent pas être imbriqués dans XML

Vous avez appris cela à la dure - si vous imbriquez une balise <fragment> basée sur une présentation XML dans un fragment chargé (potentiellement) dynamiquement de FragmentManager, vous commencez à avoir des erreurs étranges en essayant de gonfler votre fragment xml.

Il s’avère que c’est non pris en charge - que cela fonctionnera correctement si vous utilisez uniquement la méthode FragmentManager.

J'avais ce problème parce que j'essayais de charger un fragment à l'intérieur d'un <DrawerLayout> à partir de xml, ce qui provoquait un blocage de la méthode onCreateView() lorsque j'ai vidé la pile d'arrière-plan.

16
Dhiraj Gupta

Assurez-vous qu'il n'y a pas d'exception déclenchée dans la méthode onCreateView du fragment. Si une exception est générée dans cette méthode, logcat n'affiche pas les détails exacts de l'exception, mais affiche toujours le message 

Caused by: Java.lang.ClassNotFoundException: Didn't find class "Android.view.fragment" 
on path: DexPathList[[Zip file "/data/app/com.package/base.apk"],
nativeLibraryDirectories=[/data/app/com.package/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:56)
12
Lei

As-tu essayé:

 <fragment
            Android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent" />
10
Blundell

Si votre TaskDetailsFragment prolongeant Android.app.Fragment, changez dans onCreateView().

Renvoyez votre view que vous voulez montrer dans le fragment ou convertissez votre disposition en vue en utilisant LayoutInflater et renvoyez-la. 

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View mainview = inflater.inflate(R.layout.main, null);
    return mainview;
}

J'espère que ça marche. :)

6
Suryavel TR

Vérifiez votre chemin de classe, il se peut que l'inflateur de vue ne trouve pas votre définition de classe telle que définie dans votre xml Class = "de.androidbuch.activiti.task.TaskDetailsFragment" Le chemin ci-dessus peut être incorrect. 

5
mask

Je recevais cette erreur pour différentes raisons.

Étapes à suivre pour reproduire:

~> Mon problème était que j'avais créé une toute nouvelle application vierge. 

~> J'ai ensuite généré un fragment personnalisé à partir du menu Fichier ~> Nouveau fichier. 

~> Nous avons procédé à la personnalisation du fragment en ajoutant des dispositions, des boutons, etc.

~> Référence au nouveau fragment personnalisé dans le fichier activity_my.xml généré automatiquement lors de la création de l'application. Cela permettait au XML de générer les objets pour moi. 

Voici le problème lorsque vous générez le fragment personnalisé via Fichier ~> Nouveau menu Fichier. Il génère automatiquement un stub de fonction d'interface et le place au bas du fichier de classe de fragment. 

Cela signifie que votre classe MyActivity doit implémenter cette interface. Si ce n'est pas le cas, l'erreur ci-dessus se produit uniquement lors du référencement du fragment à partir de xml. En supprimant complètement la référence au fragment dans le XML et en créant le fragment à l'aide de code dans le fichier de classe MyActivity.Java, Logcat génère une erreur plus concise expliquant le problème en détail et se plaignant de l'interface. Ceci est démontré dans le modèle de projet activité + fragment. Bien que <~ ce modèle de projet ne génère pas le stub d’interface.

5
xMythicx

Pour moi, c’est après avoir fait défiler la trace de la pile que j’ai trouvé qu’il me manquait l’autorisation pour Android.permission.ACCESS_NETWORK_STATE

après avoir ajouté cette permission, il a été corrigé

5
Gil

Si vous avez des fichiers de présentation distincts pour les modes portrait et paysage et obtenez une erreur d'inflation lorsque vous modifiez l'orientation après avoir cliqué sur un élément, il existe probablement une différence entre vos fichiers de présentation.

Lorsque vous obtenez l'erreur, est-ce uniquement lorsque vous cliquez sur l'élément en mode paysage ou uniquement en mode portrait ou les deux? Votre activité TaskDetailsFragment utilise-t-elle un fichier de mise en page pouvant présenter des différences entre les modes paysage et portrait?

4
Nathan Fig

Mon problème dans ce cas était une simple instance ayant une exception dumb null pointer dans l'une de mes méthodes invoquée ultérieurement dans le cycle de vie. Cela était à l'origine de l'exception "Erreur lors de l'inflation du fragment de classe". En bref, n'oubliez pas de vérifier plus en profondeur la trace de la pile des exceptions pour rechercher une cause possible.

Une fois que j'ai résolu l'exception de pointeur nul, mon fragment s'est bien chargé.

3
oddmeter

Aucune des solutions mentionnées ci-dessus ne m'a aidé. Dans le journal, j'ai pu trouver le détail de l'exception mentionnée ci-dessous:

06-19 16:20:37.885: E/AndroidRuntime(23973): Caused by: Java.lang.RuntimeException: API key not found.  Check that /meta-data/ Android:name="com.google.Android.maps.v2.API_KEY" Android:value="your API key"/ is in the application element of AndroidManifest.xml.

Je l'ai fait et mon code fonctionnait!

<meta-data  Android:name="com.google.Android.maps.v2.API_KEY" Android:value="AIzaSyCl1yGPZ3mpxxxxxxxAz2R-t7zcWVzrHUL9k"/>
</application>
3
Khushboo

Avait le même type d'erreur, où exactement le même message d'erreur dans logcat était affiché. Je devais apporter des modifications au chemin de construction Java situé sous Project->Properties. J'avais inclus des bibliothèques liées à Google Maps telles que Android-support-v4.jar et google-play-services.jar; Cependant, il me manquait de les inclure sur le 'Build class path' dans le menu d'options 'Order and Export'. Peut-être que l'erreur est ici. 

Essayez d'inclure des bibliothèques dans le chemin d'accès aux classes de génération. 

L’ordre de construction des classes peut également déclencher l’erreur; mon conseil est donc d’essayer de réorganiser l’ordre du chemin de construction. L'erreur a disparu lorsque j'ai utilisé l'ordre suivant: 'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'. La dernière unité contient les fichiers jar mentionnés précédemment.

Si vous ajoutez Fragment de manière statique, c'est-à-dire en xml, vous n'avez peut-être pas réussi à implémenter OnFragmentInteractionListener dans votre classe Activity. Ensuite, la mise en œuvre de l'interface résoudrait le problème. Si vous ajoutez Fragment de manière dynamique, c'est-à-dire en classe Java, ce n'est pas la solution. Parce que IDE lui-même ne vous permettra pas de continuer sans implémenter les interfaces requises.

2
Shaheer Palollathil

Juste eu cette même erreur. La raison de la mienne était la visibilité de ma classe de fragments. Il a été mis à défaut, devrait être public.

1
southerton

assurez-vous que vous avez utilisé celui-ci 

<meta-data
            Android:name="com.google.Android.maps.v2.API_KEY"
            Android:value="AIzaSyBEwmfL0GaZmdVqdTxxxxxxxx-rVgvY" />

pas ça..

<meta-data 
         Android:name="com.google.Android.gms.version" 
          Android:value="AIzaSyBEwmfL0GaZmdVqdTCvxxxxxxx-rVgvY" /> 
1
DjP

J'avais un problème similaire; après avoir exécuté l'exemple AdMob , j'ai essayé d'insérer des annonces dans mon application, ce qui a provoqué l'erreur suivante:

01-02 16:48:51.269    8199-8199/it.dndc.BreathPlot E/AndroidRuntime﹕ FATAL EXCEPTION: main
Java.lang.IllegalStateException: Could not execute method of the activity
 Caused by: Android.view.InflateException: Binary XML file line #57: Error inflating class fragment

La solution est la suivante: vous ne pouvez pas insérer le fragment d’une annonce dans une ListActivity ..__ mais je pourrais l’ajouter à une FragmentActivity et à une ActionBarActivity sans aucun problème.

Ma suggestion est la suivante: commencez par l'exemple AdMob et ajoutez-y votre application existante: j'aurais gagné beaucoup de temps !!!

1
user2270629

Si vous ne voulez rien changer et aller avec " fragment "

fais ça,

<fragment
 Android:visibility="gone" (Visibility will not work, just helps in removing frag from xml viewer)(If you want the visibility to be gone make it in your fragment root element visibility=gone)
 Android:layout_width="match_parent"
 Android:layout_height="match_parent"
 Android:name="com.example.YOUR_FRAGMENT" (This is important)
 />
1
Sahaj Rana

Si vous souhaitez hériter de AppCompatActivity , vous pouvez faire quelque chose comme ceci-Dans l'activité xml, utilisez un FrameLayout like this-

<FrameLayout
    Android:id="@+id/result_fragment"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_below="@+id/progress_frame"/>

et dans l'activité onCreate-

final FragmentManager supportFragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = supportFragmentManager.beginTransaction();
    ft.replace(R.id.result_fragment, fphResultActivityFragment, "result fragment");
    ft.commitAllowingStateLoss();
1
Vaibhav Sharma

Dans votre fichier xml, utilisez simplement un au lieu de la balise . L'inflater tente de créer un Android.app.Fragment à partir duquel échouera l'API <10 . Vous devez donc créer un groupe de vues d'un type différent. .

1
Lucas de Vil

Après une journée de lutte, j’ai trouvé une vérification de scénario qui pourrait vous amener à la même chose,

Si tout fonctionne comme le code Google, veuillez vérifier le fichier manifeste dans mon cas, j’ai ajouté la clé géographique et la carte correspondant à l’exception

Remarque - N'ajoutez pas deux clés dans le fichier manifeste. Supprimez la clé de carte

meta-data
        Android:name="com.google.Android.maps.v2.API_KEY"
        Android:value="@string/google_maps_key"/>

au-dessus du code et ajoutez ce code.

 <meta-data
        Android:name="com.google.Android.geo.API_KEY"
        Android:value="@string/auto_location"/>

 <meta-data
        Android:name="com.google.Android.gms.version"
        Android:value="@integer/google_play_services_version"/>
1
Yogesh Rathi

Pourriez-vous publier les méthodes onCreate et onCreateView du fragment? J'ai eu exactement la même exception qui a été causée par une exception dans la méthode fragment onCreate; lorsque j'ai corrigé ce problème, il a corrigé le Erreur lors de l'inflation d'un fragment de classe.

1
AdamVe

J'ai eu cette erreur en utilisant un ListFragment mais l'id de vue liste était listView1 au lieu de liste.

"Votre contenu doit avoir un ListView dont l'attribut id est" Android.R.id.list ""

http://developer.Android.com/reference/Android/app/ListFragment.html

1
Eric Woodruff

Je recevais cette erreur dans Android studio le problème était que mon fragment avait une disposition relative alors que le code de la fonction OnCreateView était

mDrawerListView = (ListView) inflater.inflate(
                R.layout.fragment_navigation_drawer, container, false);

votre code fait-il la même chose?

1
Ahmad Moussa

J'ai eu la même erreur, mais mon problème était que mon fragment n'avait pas d'identifiant dans la présentation XML de l'activité parent.

1
stevethecollier

Dans mon cas,

...
Android.view.InflateException: 
Binary XML file line #24: Error inflating class fragment
...
Caused by: Java.lang.InstantiationException: 
class *.HomeFragment has no zero argument constructor
...

Après avoir ajouté le constructeur vide, le problème est résolu.

public HomeFragment() {}
0
TonnyTao

Voici ma solution à ce problème.

Caused by: Android.view.InflateException: Binary XML file line #31: Error inflating class fragment
Caused by: Java.lang.IllegalArgumentException: Binary XML file line #31: Duplicate id 0x7f09006d, tag null, or parent id 0xffffffff with another fragment for com.example.eduardf.audit.DateTime

Dans mon cas, l'erreur s'est produite lors de la réouverture de DialogFragment avec un fragment. 

<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">
        <TextView
            Android:id="@+id/title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:drawableStart="@drawable/ic_black_edit_24px"
            Android:singleLine="true" />
        <fragment
            Android:id="@+id/fragment_date"
            Android:name="com.example.eduardf.audit.DateTime"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            tools:layout="@layout/fragment_date_time" />
    </LinearLayout>
</Android.support.constraint.ConstraintLayout>

DailogFragment stocke le fragment après le premier gonflement ..__ Pour éviter que cela ne se produise, j'ai effacé de force le fragment. 

@Override
public void onDestroyView () {
    if (!(afterRotate || getActivity() == null)) {
        final FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        final Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_date);
        if (fragment != null)
            fragmentManager.beginTransaction().remove(fragment).commit();
    }
    super.onDestroyView();
}

Nous devions également nous occuper de la suppression inutile du fragment, par exemple lorsque vous faites pivoter l'écran.

private boolean afterRotate = false;
...
@Override
public void onSaveInstanceState (Bundle outState) {
    super.onSaveInstanceState(outState);
    afterRotate = true;
}
0
Eduard Fomin

Si votre fragment est un fragment de liste, l'activité qui utilise ce fragment doit implémenter l'interface onFragmentInteraction.

0

Mon approche simple

Si vous utilisez <fragment> dans votre fichier xml, vous devez fournir l'attribut name i.e; 

      <fragment 
        Android:name='path.to.your.fragment
        />`

ce qui initialisera votre fragment et vous n’aurez pas besoin de le faire à partir de Java.

Si vous voulez utiliser l'approche Java pour ajouter un fragment, utilisez n'importe quelle disposition telle que

<LinearLayout
   Android:id="@+id/fragment_container"
 />

et utilisez ce conteneur pour votre fragment

transaction.replace(R.id.fragment_container, fragment_obj);
0
Santosh Kumar

Assurez-vous que votre activité étend FragmentActivity ou AppCompatActivity

0
Riyas PK

Assurez-vous d’avoir mis votre google-services.json dans votre dossier respectif et ajouté 

<meta-dataandroid:name="com.google.Android.geo.API_KEY" Android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />

dans votre fichier manifeste. Vérifiez votre note avec "implémentation 'com.google.Android.gms: play-services-maps: 15.0.1'"

Ça va marcher.

0
Sankha Pattanayak