Android.view.InflateException: Archivo XML binario: Error al inflar el fragmento de clase

Tengo un error muy frustrante que no puedo explicar. He creado una aplicación de Android que utiliza Android AppCompat para que sea compatible con versiones anteriores. Aquí está mi archivo de disposición de actividad principal:

 <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> 

Y aquí está el código principal de mi actividad:

 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 

El problema principal aquí es: el código anterior funciona suavemente en casi dispositivos (dispositivo estimulado, o algunos dispositivos reales). Pero cuando lo ejecuto en Samsung S3. Observa este error:

J

 ava.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) 

Por favor, dime cómo solucionar el error, gracias 🙂

Después de mucho tiempo para depurar, he arreglado este problema. (Aunque todavía no puedo explicar por qué). Que cambio la propiedad android:name a class . (Aunque en el documento de Android, dicen que las propiedades son las mismas, pero funciona!)

Por lo tanto, debe cambiar de:

  android:name="com.fragment.NavigationDrawerFragment" 

a

 class = "com.fragment.NavigationDrawerFragment" 

Por lo tanto, el nuevo diseño debe ser:

 <!-- 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" class = "com.fragment.NavigationDrawerFragment" /> 

Espero que esto ayude 🙂

No pude resolver mi problema usando las respuestas proporcionadas. Finalmente cambié esto:

 <fragment android:id="@+id/fragment_food_image_gallery" android:name="ir.smartrestaurant.ui.fragment.ImageGalleryFragment" android:layout_width="match_parent" android:layout_height="200dp" android:layout="@layout/fragment_image_gallery" tools:layout="@layout/fragment_image_gallery" /> 

a esto :

 <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="200dp" /> 

,

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

y funciona.
Si lo está utilizando dentro del fragmento, utilice getChildFragmentManager en lugar de getSupportFragmentManager .

Tal vez no sea necesario para usted más, pero si otros lectores lo encuentran útil. Tengo exacto mismo android.view.InflateException:...Error inflating class fragment . Tenía todas las bibliotecas correctas incluidas. Resuelto añadiendo un permiso de usuario más en el archivo AndroidManifest.xml ie <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Btw Yo estaba ejecutando Android Studio 0.8.9 on Ubuntu 12.04.

Tuve el mismo problema, problema, probado todas las respuestas en este hilo sin éxito. Mi solución era, yo no había añadido una identificación en el XML de la actividad. No pensé que importaría, pero lo hizo.

Así que en la Actividad XML tuve:

 <fragment android:name="com.covle.hellocarson.SomeFragment" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

Pero debería haber tenido:

 <fragment android:id="@+id/some_fragment" android:name="com.covle.hellocarson.SomeFragment" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

Si alguien estuviera feliz de comentar por qué esto es, yo soy todos los oídos, a otro, espero que esto ayude.

¿Es su NavigationDrawerFragment extendiendo el archivo android.support.v4.app.Fragment? En otras palabras, ¿está importando el paquete correcto?

 import android.support.v4.app.Fragment; 

Tengo el mismo problema porque no implementé el oyente. Vea el siguiente código con /*Add This!*/ .

 public class SomeActivity extends AppCompatActivity implements BlankFragment.OnFragmentInteractionListener /*Add this!*/ { @Override /*Add This!*/ public void onFragmentInteraction(Uri uri){ /*Add This!*/ } /*Add This!*/ } 

FYI, mi clase de fragmentos es algo como lo siguiente:

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

Editar:

También observo este mismo mensaje de error bajo otras circunstancias cuando hay una excepción en la función onCreate del Fragment . Tengo algo como lo siguiente:

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

Como reutilizo este fragmento, me olvido de establecer argumentos. Entonces el resultado de getArguments() es null . Obviamente, obtengo una excepción de puntero null aquí. Le sugeriré que mantenga un ojo en los errores como esto también.

También tuve este problema. Lo solucioné reemplazando la importación en MainActivity y NavigationDrawerFragment

De

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

A

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

He actualizado MainActivity para extender ActionBarActivity lugar de Actividad

 public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks 

También use ActionBar actionBar = getSupportActionBar(); Para obtener el ActionBar

Y he actualizado la siguiente función en NavigationDrawerFragment

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

Por si alguien necesita esto. Hipótesis: Teléfono del dispositivo conectado al cable USB y su IDE para iniciar la aplicación. Vaya al símbolo del sistema para determinar el problema: introduzca adb logcat

A continuación, inicie su aplicación desde IDE. Usted será una excepción.

En mi caso: estaba desplegando una aplicación para Android de la versión 2.3 a un dispositivo móvil que no admitía el widget "Espacio"

Este problema surge cuando tiene una clase personalizada que extiende una clase diferente (en este caso una vista) y no importa todos los constructores requeridos por la clase.

Por ejemplo: public class CustomTextView extends TextView {}

Esta clase tendría 4 constructores y si te pierdes en cualquiera que se estrellaría. Para la cuestión de hecho me perdí el último que fue utilizado por Lollipop agregó que el constructor y funcionó bien.

He tenido problemas similares dentro y fuera. El mensaje de error a menudo proporciona muy poco detalle, independientemente de la causa real. Pero encontré una manera de obtener información más útil. Resulta que la clase androide interna 'LayoutInflater.java' (en el paquete android.view) tiene un método de inflar que vuelve a lanzar una excepción, pero no recoge los detalles, por lo que pierde información sobre la causa.

Utilicé AndroidStudio y establecí un punto de interrupción en la línea 539 de LayoutInflator (en la versión en la que estoy trabajando), que es la primera línea del bloque catch para una excepción genérica en ese método 'inflate':

  } catch (Exception e) { InflateException ex = new InflateException( parser.getPositionDescription() + ": " + e.getMessage()); ex.initCause(e); throw ex; 

Si observa 'e' en el depurador, verá un campo 'causa'. Puede ser muy útil para darle una pista sobre lo que realmente ocurrió. Así es como, por ejemplo, encontré que el padre de un fragmento incluido debe tener un id, aunque no se use en su código. O que un TextView tenía un problema con una dimensión.

TL / DR : Se produjo una excepción durante la creación de un fragmento referenciado a partir de un XML de nivel superior. Esta excepción provocó el fallo de la inflación de diseño de nivel superior, pero no se informó la excepción inicial ; Sólo el fallo de inflación de nivel superior aparece en el seguimiento de la pila. Para encontrar la causa raíz, usted tiene que coger y registrar la excepción inicial .


La causa inicial del error podría ser una amplia variedad de cosas, por lo que hay tantas respuestas diferentes aquí en cuanto a lo que arregló el problema para cada persona. Para algunos, tenía que ver con los atributos id , class o name . Para otros, se debía a un problema de permisos oa una configuración de compilación. Para mí, ésos no solucionaron el problema; En cambio había un recurso que sólo existía en drawable-ldrtl-xhdpi , en lugar de en un lugar aplicable como drawable .

Pero esos son sólo detalles. El problema de imagen grande es que el mensaje de error que aparece en logcat no describe la excepción que lo inició todo. Cuando un layout XML de alto nivel hace referencia a un fragmento, se llama a onCreateView() del fragmento. Cuando se produce una excepción en un onCreateView() un fragmento onCreateView() (por ejemplo, al inflar el diseño XML del fragmento), provoca el fallo de la inflación del XML de disposición de alto nivel. Este fallo de inflación de nivel más alto es lo que se informa como una excepción en los registros de errores. Pero la excepción inicial no parece viajar hasta la cadena lo suficientemente bien para ser reportado.

Dada esa situación, la pregunta es cómo exponer la excepción inicial, cuando no aparece en el registro de errores.

La solución es bastante sencilla: Ponga un bloque try / catch alrededor del contenido de onCreateView() del fragmento onCreateView() , y en la cláusula catch , registre la excepción:

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

Puede que no sea obvio qué clase de fragmento onCreateView() haga esto, en cuyo caso, hágalo a cada clase de fragmento que se usa en el diseño que causó el problema. Por ejemplo, en el caso del OP, el código de la aplicación donde se produjo la excepción fue

 at android.app.Activity.setContentView(Activity.java:1901) 

cual es

  setContentView(R.layout.activity_main); 

Por lo tanto, es necesario capturar excepciones en el onCreateView() de cualquier fragmento que se haga referencia en el layout activity_main .

En mi caso, la excepción de causa raíz resultó ser

 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} 

Esta excepción no apareció en el registro de errores hasta que lo onCreateView() en onCreateView() y lo registró explícitamente. Una vez que se registró, el problema era fácil de diagnosticar y corregir ( details_view.xml sólo existía bajo la carpeta ldrtl-xhdpi , por alguna razón). La clave era captar la excepción que era la raíz del problema, y ​​exponerlo.

No hace daño hacer esto como un boilerplate en todos sus fragmentos ' onCreateView() métodos. Si hay una excepción no captada en allí, se bloqueará la actividad independientemente. La única diferencia es que si captura y registra la excepción en onCreateView() , no estará en la oscuridad de por qué sucedió.

PS Acabo de darme cuenta de esta respuesta está relacionada con @ DaveHubbard, pero utiliza un enfoque diferente para encontrar la causa raíz (logging vs depurador).

También debemos agregar el siguiente en build.gradle (app)

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

Siempre que utilicemos nuevos diseños o nuevas características de diseño. Espero que esto le ayude.

Me enfrenté a este problema y lo resolvió mediante el uso de los siguientes códigos. Comencé la transacción del fragmento usando el encargado del childfragment.

diseño:

  <fragment class="com.google.android.youtube.player.YouTubePlayerSupportFragment" android:id="@+id/youtube_fragment" android:layout_width="match_parent" android:layout_height="wrap_content"/> 

Esto es cómo comencé la transacción del fragmento:

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

Los códigos siguientes explican cómo quité el fragmento que agregó usando 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; } 

Después de que ninguna de las respuestas aquí me ayudó, opté por ejecutar la aplicación en modo de depuración moviéndose a través de cada línea de onCreateView en mi fragmento (NavigationDrawerFragment en su caso). Y notó que el fragmento tenía dificultad para inflar debido a una NullPointerException. P.ej

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

Aquí mySeekBar se estableció en null (porque había perdido la adición del control en el diseño adecuado) y la siguiente línea entró en NPE que salió como InflateException. Además, como se sugirió anteriormente, cambie el nombre de android: nombre a clase.

Este problema puede surgir por varias razones antes mencionadas. Recomendaría flujo de depuración línea por línea para saber qué es lo que está mal.

No sé si esto ayudará.

Tuve este problema con un TextView que tenía en el diseño que estaba tratando de inflar ( android.view.InflateException: archivo binario XML línea # 45: error de inflar la clase TextView ).

Yo había establecido el siguiente atributo XML android: textSize = "? Android: attr / textAppearanceLarge" que no estaba permitiendo que el diseño de ser inflados.

No sé exactamente por qué, ( todavía estoy un poco nuevo para Android – menos de un año de experiencia ), podría tener algo que ver con los atributos del sistema de llamadas, idk, todo lo que sé es tan pronto como he utilizado llano viejo @ Dimen / md_text_16sp ( que es una costumbre mía ), problema resuelto 🙂

Espero que esto ayude…

Creo que el problema básico es con "android: targetSdkVersion" que se define en AndroidManifest.xml. En mi caso, el valor inicial que he definido como:

android:targetSdkVersion=16

Lo cambié a:

android:targetSdkVersion=22

Que resolvió todo mi error. Por lo tanto, la configuración de la correcta "targetSdkVersion" también es importante antes de construir una aplicación para Android.

En caso de que alguien más venga aquí y las respuestas no ayudan a resolver el problema, una cosa más para probar.

Como otros han mencionado, esto suele ser causado por un problema anidado en el propio XML en oposición a algo que hizo mal en su Java. En mi caso, fue un error super fácil (y estúpido) arreglar.

Tenía código como este:

 <view android:layout_width="fill_parent" android:layout_height="1dip" android:id="@+id/view44" android:background="@color/gray" /> 

Cuando todo lo que tenía que hacer era capitalizar el v en 'View' para que el sistema lo reconociera. Compruebe que sus vistas personalizadas (o fragmentos, recyclerviews, etc) todos tienen la declaración de mayúsculas correctamente por adelantado para que el auto-completar XML coincidirá con la vista adecuada.

Para algunos de ustedes que aún no han encontrado una solución para esto, en mi caso estaba sucediendo porque tenía un OOM (Out of Memory) cuestión. Esto puede suceder cuando, por ejemplo, tiene una pérdida de memoria en su aplicación cuando la utiliza durante mucho tiempo. En mi rastro de la pila, ésta era la razón principal.

Tenía esto en un dispositivo 4.4.2, pero 5+ estaba bien. La causa: dentro de la inicialización de una vista personalizada, estaba creando un TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) , que es API 21+.

Android Studio 2.1 no se queja de que a pesar de que se anota TargetApi(21) . Al parecer, Android Studio 2.2 corregirá esto y lo mostrará correctamente como un error.

Espero que esto ayude a alguien.

Tuve este error también, y después de muy largo depurar el problema cosido a ser que mi MainClass extendido Actividad en lugar de FrameActivity, en mi caso, el xml no era un problema. Espero poder ayudarte.

Como se mencionó en un post anterior,
rebautizar

 android:name="com.fragment.NavigationDrawerFragment" 

a

 class = "com.fragment.NavigationDrawerFragment" 

Sin embargo, no funcionó para mí. Entonces utilicé simplemente el nombre de la clase sin la pieza del com.fragment y voila trabajó. Así que cambíelo finalmente a

 class = "NavigationDrawerFragment" 

En mi caso .

El diseño que estaba tratando de inflar había

 <include layout = "...." /> 

Etiqueta, la eliminación de lo fijado.

Intentaba inflar un diseño anterior diseñado para un Actvity en el adaptador view-pager.

Mi error fue causado por un problema diferente.

Estaba pasando un paquete de una actividad a su fragmento. Cuando comenté el código que recibía el paquete en el fragmento, el error había desaparecido. Como resulta, mi error se debió a la siguiente "getArguments ();" Parte que estaba volviendo nulo.

 Bundle args = getArguments(); 

Al comprobar el código de envío de actividad, me di cuenta de que tenía un error tonto en el siguiente;

 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(); 

Estaba creando un NUEVO fragmento en la línea con la flecha. Mientras que yo debería haber utilizado el fragmento pre-instanciado que ya tenía mi paquete. Así que debería haber sido:

 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(); 

No sé por qué exactamente lanza este error en lugar de un NPE, pero esto resolvió mi error en caso de que alguien está teniendo el mismo escenario

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.