Error al inflar el fragmento de clase

161

Me sale el error

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

cuando cambio a través del modo vertical y horizontal. Estoy usando fragmentos Mi xml es:

 <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 cambio a través del modo horizontal y vertical, todo funciona bien. Pero cuando hago clic en mi fragmento (y puedo ver mi fragmento) y luego cambio al otro modo, aparece el error. ¿Alguna idea de cómo puedo resolverlo? Encontré algunas respuestas aquí, pero ninguna de estas me ayudó ...

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
tsync
fuente
¿Mantiene archivos de diseño separados en sus carpetas de diseño y tierra de diseño?
Nathan Fig
¿Puede proporcionar el registro de errores completo, incluidas las líneas después de "No se puede iniciar la actividad ..."
Dave
@Nathan Fig: sí, pero
obtengo
@Dave: aquí tienes ... ¿alguna idea?
tsync
Necesita un código de diseño horizontal, y también serían útiles sus llamadas a setContentView y también cómo está desactivando la actividad en modo vertical, como supongo que sí. Por el momento no parece haber suficiente información. Mirar el ejemplo de FragmentLayout en las demostraciones de API puede ayudarlo, ya que parece que está haciendo algo similar.
PJL

Respuestas:

131

Como dijo hdemirchian, asegúrese de usar:

import android.support.v4.app.Fragment;

Y también asegúrate de que la Actividad que usa los fragmentos se extienda en FragmentActivitylugar de la regular Activity,

import android.support.v4.app.FragmentActivity;

para obtener la FragmentActivityclase

Dandre Allison
fuente
12
Esto se votó mucho, pero para mí se bloquea al reanudar la aplicación, y ya estoy usando v4 Fragment y v4 FrsgmentActivity, para ser más precisos AppCompatActivity.
joseph
44
Esta no es la solución. importar android.support.v4.app.Fragment; No cambia nada. En realidad, incluso es una importación no utilizada e innecesaria.
f470071 el
77
Gracias, una nota al margen es que AppCompatActivity es un descendiente de FragmentActivity.
abedfar
pero estoy usando el fragmento de daga, y el fragmento de daga siempre extiende la actividad de fragmento, no de fragmento
user3475052
96

La excepción android.view.InflateException: Binary XML file line: #... Error inflating class fragmentpodría suceder si manipulas getActivity()dentro de tu fragmento antes de que onActivityCreated()te llamen. En tal caso, recibe una referencia de actividad incorrecta y no puede confiar en eso.

Por ejemplo, el siguiente patrón es incorrecto:

@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;
}

Corregir patrón # 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;
}

Corregir patrón # 2

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

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...);
}
Grigori A.
fuente
@MaximKorobov Puede llamar getActivity()dentro onActivityCreated()o en cualquier método de ciclo de vida posterior, pero antes onDestroyView().
Grigori A.
¡Muchas gracias, esto ayudó muchísimo!
Shotgun Ninja
Gracias :-) esto me ahorró mucho tiempo :)
user1007522
Me encantaría saber más sobre esto, tengo un accidente esporádico y creo que este podría ser el problema. Aunque la mayoría de las veces el código funciona bien, es difícil saberlo
Daniel Wilson
El patrón 2 podría haberlo resuelto por mí. Dedos cruzados. Gracias por eso.
joseph
36

Yo tenía el mismo error. Estuve cavando todo el día, no sé, pero creo que probé ~ 25 soluciones para este problema. Ninguno funcionó hasta que a las 2 a.m. descubrí que me faltaba esta línea en el manifiesto de aplicaciones xml:

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

Esa línea estaba dentro de la <application>etiqueta. Realmente espero que esto ayude a alguien. GL.

Matiss
fuente
3
Mi héroe. ¡Gente como tú hace TAN genial!
capdragon
55
Explica lo que está pasando por favor. ¿Cuál es el beneficio de esta línea?
Mansour Fahad
2
Gracias, salva mi día. Cada muestra de uso del mapa de Google en Android funciona de manera diferente, me pregunto si hay un estándar.
usuario2812866
22

Yo tuve el mismo problema. La solución para mí fue el orden de super.onCreate y setContentView dentro de FragmentActivity

El siguiente orden funciona bien:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);
Wilko
fuente
3
¿Por qué esto lo arregla?
Spencer
1
En un método JAVA, supersiempre se debe llamar al comienzo del método.
Stéphane Bruckert
11
@ StéphaneBruckert no siempre se super.method()debe llamar primero. Depende de lo que haga el método de la superclase. En el caso de FragmentActivityque haga algo de inicialización necesaria para que setContentViewfuncione correctamente. Sin embargo, en otro método (por ejemplo onKeyUp), es posible que desee realizar un trabajo condicional con la acción, pero recurrir super.onKeyUpen ese caso, es muy probable que desee llamar super.onKeyUpal final de la función.
CoatedMoose
Probablemente también valga la pena señalar que super()(el constructor de la superclase) debe ser la primera función llamada en cualquier constructor de clases secundarias, sin embargo, llamarlo no es necesariamente obligatorio (dependería completamente de la clase que se extienda).
CoatedMoose
17

Los fragmentos no se pueden anidar en XML

Aprendí esto de la manera difícil: si anida una <fragment>etiqueta basada en el diseño XML dentro de un fragmento (potencialmente) cargado dinámicamente FragmentManager, entonces comienza a obtener errores extraños, tratando de inflar su fragmento xml.

Resulta que esto no es compatible; funcionará bien si lo hace solo con el FragmentManagerenfoque.

Estaba teniendo este problema porque estaba intentando cargar un fragmento dentro de un <DrawerLayout>archivo xml, y esto estaba causando un bloqueo en el onCreateView()método cuando abrí la pila trasera.

Dhiraj Gupta
fuente
¿Esto todavía no es compatible? A partir deappcompat-v7:23.3.0
thanassis
sí, estoy anidando un fragmento dentro de xml. Lo investigaré.
KDeogharkar
Pero existen soluciones / hacks para el problema: stackoverflow.com/a/14695397/860488
Morten Holmgaard
2
Consulte la nota al final de esta sección para confirmar: developer.android.com/about/versions/…
Philippe
No estoy seguro de por qué la solución es TAN simple. para mí, solo reemplazando <fragment>con <frameLayout>trabajado. Todavía lo estoy descubriendo. - stackoverflow.com/a/19167009/5477548
yoad w
16

Estaba teniendo el mismo problema que tú enfrentas. Ninguno de los consejos en la parte superior me ayudó. Más tarde, descubrí que todo lo que tenía que hacer era arreglar mis importaciones desde:

import android.app.Fragment;

a:

import android.support.v4.app.Fragment;
hdemirchian
fuente
Gracias, esta solución también funcionó para mí. Estuve luchando con este problema durante 2 días. Finalmente su solución funcionó para mí. Gracias hdemirchian ..
Lakshmanan
¡Usted es maravilloso! Mi problema era opuesto: el asistente Fragment importa android.support.v4.app.Fragment de forma predeterminada. Y mi actividad principal extiende android.app.Activity.
Control Industrial Freak
12

Has probado:

 <fragment
            android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
Blundell
fuente
1
Nos ha mostrado 1 archivo xml, pero debería tener 2 uno en / layout / y uno en layout-land /
Blundell
12

Asegúrese de que no haya ninguna excepción generada en el método onCreateView del fragmento. Si se genera alguna excepción en este método, logcat no mostrará los detalles exactos de la excepción, sino que siempre mostrará el mensaje:

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)
Lei
fuente
Solo para agregar lo que Lei está diciendo es, intente probar el código dentro de su vista de creación y descubra la causa raíz real. Gracias Lei!
Swaroop
6

Si se está TaskDetailsFragmentextendiendo android.app.Fragment, cambie onCreateView().

Devuelva su vista que desea mostrar en el Fragmento o convierta su Diseño para ver usando LayoutInflater y devuélvala.

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

Espero que esto funcione. :)

Suryavel TR
fuente
6

Verifique su ruta de clase, esta podría ser la vista que el inflador no pudo encontrar su definición de clase como se define en su clase xml = "de.androidbuch.activiti.task.TaskDetailsFragment" la ruta anterior podría estar equivocada.

máscara
fuente
6

Estaba recibiendo este error por diferentes razones.

Pasos para reproducir:

~> Mi problema fue que creé una nueva aplicación en blanco.

~> Luego generé un fragmento personalizado del Archivo ~> Nuevo menú de archivo.

~> Se procedió a personalizar el fragmento agregando diseños y botones, etc.

~> Hice referencia al nuevo fragmento personalizado en la actividad_mx.xml generada automáticamente que se generó para mí al crear la aplicación. Hacer esto permitió que el XML generara los objetos por mí.

Aquí está el truco al generar el fragmento personalizado a través de Archivo ~> Nuevo menú de archivo, genera automáticamente un código auxiliar de función de interfaz y lo coloca en la parte inferior del archivo de clase de fragmento.

Esto significa que su clase MyActivity debe implementar esta interfaz. Si no es así, el error anterior se produce solo cuando se hace referencia al fragmento de xml. Al eliminar completamente la referencia para el Fragmento en el XML y crear el fragmento a través del código en el archivo de clase MyActivity.java, Logcat genera un error más conciso que explica el problema en detalle y se queja de la interfaz. Esto se demuestra en la Actividad de plantilla de proyecto + Fragmento. Aunque, <~ esa plantilla de proyecto no genera el stub de interfaz.

xMythicx
fuente
5

Para mí fue después de desplazarme en el seguimiento de la pila que encontré que me falta el permiso para android.permission.ACCESS_NETWORK_STATE

después de agregar este permiso se solucionó

Gil
fuente
1
No a uno mismo: "desplácese por todo el rastro de la pila. Gracias @Gil.
Batandwa
4

Si tiene archivos de diseño separados para los modos vertical y horizontal y obtiene un error de inflado cada vez que cambia la orientación después de hacer clic en un elemento, lo más probable es que haya una discrepancia entre sus archivos de diseño.

Cuando recibe el error, ¿es solo cuando hace clic en el elemento en modo horizontal o solo en modo vertical o ambos? ¿Su actividad TaskDetailsFragment utiliza un archivo de diseño que podría tener discrepancias entre los modos horizontal y vertical?

Nathan Fig
fuente
Gracias por su respuesta ... bueno, solo tengo un fragmento en el modo horizontal y no en el modo vertical. Así que solo puedo hacer clic en el modo horizontal para ver el fragmento. Y después de cambiar nuevamente al modo horizontal me sale este error ...
tsync
Es casi seguro que el problema es que tienes una vista en modo vertical que no se puede encontrar en modo horizontal. ¿Agregar el fragmento al paisaje soluciona el problema?
Nathan Fig
1
Puede tener vistas que no existen en ambos archivos; ese es el punto de tener diseños separados de tierra y puerto. Sin embargo, verifique los identificadores: me faltaba la identificación en mi archivo de retrato y recibía este error al cambiar.
maxpolun
4

Si está agregando Fragmentestáticamente, es decir, en xml, es posible que no haya implementado OnFragmentInteractionListeneren su Activityclase. Entonces la implementación de la interfaz resolvería el problema. Si está agregando Fragmentdinámicamente, es decir, en la clase java, entonces esta no es la solución. Porque IDE en sí mismo no le permitirá continuar sin implementar las interfaces requeridas.

Shaheer Palollathil
fuente
3

Mi problema en este caso fue una simple instancia de tener una excepción de puntero nulo tonto en uno de mis métodos que se invocó más adelante en el ciclo de vida. Esto me estaba causando la excepción "Error al inflar el fragmento de clase". En resumen, recuerde verificar más abajo en el seguimiento de la pila de excepciones por una posible causa.

Una vez que resolví la excepción de puntero nulo, mi fragmento se cargó bien.

oddmeter
fuente
3

Ninguna de las soluciones mencionadas anteriormente me ayudó. En el registro pude encontrar el detalle de la excepción como se menciona a continuación:

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.

¡Hice esto y mi código estaba funcionando!

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

Si no quieres cambiar nada e ir con la etiqueta " fragmento "

hacer esto,

<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)
 />
Sahaj Rana
fuente
2

Tenía el mismo tipo de error, donde se mostraba exactamente el mismo mensaje de error en logcat. Necesitaba hacer cambios en la ruta de compilación de Java ubicada debajo Project->Properties. Había incluido bibliotecas relacionadas con Google Maps como android-support-v4.jary google-play-services.jar; Sin embargo, me faltaba incluirlos 'Build class path'en el 'Order and Export'menú de opciones. Quizás el error yace aquí.

Intente incluir bibliotecas en la ruta de clase de compilación.

El orden en el que se crean las clases también puede desencadenar el error, por lo que mi consejo también es tratar de reorganizar el orden de la ruta de construcción. El error desapareció cuando utilicé el siguiente orden: 'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'. La última unidad contiene los archivos jar mencionados anteriormente.

Christian Bøge-Rasmussen
fuente
1

En su archivo xml simplemente use un en lugar de la etiqueta. El inflador intenta crear un android.app.Fragment desde el cual fallará en API <10. Por lo tanto, debe crear un grupo de vista de un tipo diferente.

Lucas de Vil
fuente
1

asegúrate de haber usado este

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

no esta..

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

Acabo de tener este mismo error. La razón de la mía fue la visibilidad de mi clase de fragmentos. Se estableció en predeterminado, debe ser público.

Southerton
fuente
1

¿Podría publicar los fragmentos onCreatey onCreateViewmétodos? Tuve exactamente la misma excepción causada por una excepción en el onCreatemétodo del fragmento , cuando solucioné ese problema, solucionó el error al inflar el fragmento de clase.

AdamVe
fuente
1

Estaba recibiendo este error en Android Studio, el problema era que mi fragmento tenía un diseño relativo mientras que el código de la función OnCreateView era

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

¿Tu código está haciendo lo mismo?

Ahmad Moussa
fuente
1

Si desea heredar AppCompatActivity , puede hacer algo como esto: en la actividad xml, use un FrameLayout como este:

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

y en la actividad onCreate-

final FragmentManager supportFragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = supportFragmentManager.beginTransaction();
    ft.replace(R.id.result_fragment, fphResultActivityFragment, "result fragment");
    ft.commitAllowingStateLoss();
Vaibhav Sharma
fuente
Gracias, esto ayudó. No estoy seguro de por qué pude usar <fragment> en mi diseño con éxito en otras aplicaciones en las que he trabajado, ¡pero no estaba funcionando aquí!
SingularityFuture
solo tenga en cuenta que esto puede funcionar, pero generalmente es para fragmentos dinámicos no estáticos
Tanner Summers
1

Obtuve el mismo error, pero mi problema fue que mi fragmento no tenía una identificación en el diseño xml de la actividad principal.

stevethecollier
fuente
1

Después de un día de lucha, encontré alguna comprobación de escenario, es posible que estés enfrentando lo mismo,

Si todo funciona igual que el código de Google, compruebe el archivo de manifiesto en mi caso, agregué la clave geográfica y la clave del mapa, por eso se produce una excepción,

Nota: no agregue dos claves en el archivo de manifiesto, elimine la clave del mapa

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

código anterior y agregue este código.

 <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"/>
Yogesh Rathi
fuente
1

Tuve un problema similar; después de ejecutar el ejemplo de AdMob , intenté insertar anuncios en mi aplicación, lo que provocó este error:

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 solución es: no puede insertar el fragmento de un anuncio en ListActivity. En cambio, podría agregarlo a un FragmentActivity y a un ActionBarActivity sin ningún problema.

Mi sugerencia es: comience desde el ejemplo de AdMob y agregue en él su aplicación existente: ¡Hubiera ahorrado mucho tiempo!

usuario2270629
fuente
1

Si utiliza la ofuscación con el componente de navegación, debe excluir el fragmento de Android y sus argumentos. Agregue estas líneas a sus archivos de reglas de protección:

# Exclude the fragments and argType for navigation component.
-keep class * extends androidx.fragment.app.Fragment{}
-keep class com.safetonet.presentation.features.parent.adddevice.model.PresentableAddDeviceData
usuario3193413
fuente