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
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
.
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(...);
}
Assurez-vous que votre Activity
prolonge FragmentActivity
.
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.
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);
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;
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.
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)
As-tu essayé:
<fragment
Android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" />
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. :)
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.
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.
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é
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?
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é.
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>
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.
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.
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" />
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 !!!
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)
/>
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();
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. .
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"/>
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.
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
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?
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.
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() {}
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;
}
Si votre fragment est un fragment de liste, l'activité qui utilise ce fragment doit implémenter l'interface onFragmentInteraction
.
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);
Assurez-vous que votre activité étend FragmentActivity ou AppCompatActivity
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.