android.view.InflateException: archivo XML binario: error al inflar el fragmento de clase

Tengo un error muy frustrante que no puedo explicar. Android AppCompat una aplicación de Android que usa Android AppCompat para que sea compatible con versiones anteriores. Aquí está mi archivo principal de diseño de actividades:

        

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 principal problema aquí es: el código anterior se ejecuta sin problemas en casi dispositivos (dispositivos estimulados o algunos dispositivos reales). Pero cuando lo ejecuto en Samsung S3. Se da cuenta de este error:

 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) 

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

Después de mucho tiempo para la depuración, he solucionado 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 esas propiedades son las mismas, ¡pero funciona!)

Entonces, debería cambiar de:

  android:name="com.fragment.NavigationDrawerFragment" 

a

 class = "com.fragment.NavigationDrawerFragment" 

Entonces, el nuevo diseño debería ser:

      

Espero que esto ayude 🙂

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

  

a esto :

  

,

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

y funciona.
Si lo está usando dentro de un fragmento, use getChildFragmentManager en lugar de getSupportFragmentManager .

Puede que ya no sea necesario para ti, pero si otros lectores lo encuentran útil. Tengo exactamente la misma android.view.InflateException:...Error inflating class fragment . Tenía todas las bibliotecas correctas incluidas. Se solucionó agregando un permiso de usuario más en el archivo AndroidManifest.xml , es decir,

Por cierto, estaba ejecutando Android Studio 0.8.9 on Ubuntu 12.04.

Tuve el mismo problema, problema, intenté todas las respuestas en este hilo inútilmente. Mi solución fue: no había agregado una ID en el XML de actividad. No pensé que importaría, pero lo hizo.

Entonces en el Activity XML tuve:

  

Pero debería haber tenido:

  

Si alguien estaría feliz de comentar por qué es esto, soy todo oídos, espero que esto ayude.

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 fragmento 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 veo este mismo mensaje de error en otras circunstancias cuando hay una excepción en la función onCreate del Fragment . Tengo algo como el 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; } 

Debido a que reutilizo este fragmento, me olvido de establecer argumentos. Entonces el resultado de getArguments() es null . Obviamente, obtengo una excepción de puntero null aquí. Sugeriré que también vigiles errores como este.

¿NavigationDrawerFragment extiende el android.support.v4.app.Fragment? En otras palabras, ¿está importando el paquete correcto?

 import android.support.v4.app.Fragment; 

También tuve este problema. Lo resolví 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; 

MainActivity para extender ActionBarActivity lugar de Activity

 public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks 

También use ActionBar actionBar = getSupportActionBar(); para obtener la ActionBar

Y actualicé la siguiente función en NavigationDrawerFragment

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

TL / DR : se ha producido una excepción durante la creación de un fragmento al que se hace referencia desde un XML de diseño de nivel superior. Esta excepción provocó que la inflación de diseño de nivel superior fallara, pero la excepción inicial no se informó ; solo aparece la falla de inflación de nivel más alto en el seguimiento de la stack. Para encontrar la causa raíz, debe capturar y registrar la excepción inicial .


La causa inicial del error podría ser una gran variedad de cosas, por lo que aquí hay tantas respuestas diferentes sobre qué fue lo que solucionó el problema para cada persona. Para algunos, tenía que ver con los atributos id , class o name . Para otros fue debido a un problema de permisos o una configuración de comstackción. Para mí, esos no solucionaron el problema; en cambio, había un recurso drawable-ldrtl-xhdpi que existía solo en drawable-ldrtl-xhdpi , en lugar de en un lugar aplicable como drawable .

Pero esos son solo detalles. El problema de la gran imagen es que el mensaje de error que aparece en logcat no describe la excepción que lo inició todo. Cuando un XML de diseño de nivel superior hace referencia a un fragmento, se onCreateView() al onCreateView() del fragmento. Cuando se produce una excepción en el elemento onCreateView() un fragmento (por ejemplo, al inflar el XML de diseño del fragmento), se produce un error en el inflado del XML de diseño de nivel superior. Esta falla de inflación de nivel superior es lo que se informa como una excepción en los registros de errores. Pero la excepción inicial no parece viajar en la cadena lo suficientemente bien como para ser informada.

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: coloque un bloque try / catch alrededor del contenido 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 para qué hacer esto en la clase de fragmento onCreateView() , en cuyo caso, hágalo en cada clase de fragmento que se use 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, debe detectar excepciones en onCreateView() de cualquier fragmento al que se haga referencia en 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 la atrapé en onCreateView() y la onCreateView() forma explícita. Una vez que se registró, el problema fue lo suficientemente fácil de diagnosticar y corregir ( details_view.xml existía solo en la carpeta ldrtl-xhdpi , por algún motivo). La clave fue captar la excepción que era la raíz del problema y exponerlo.

No está de más hacer esto como una repetición en todos los métodos de tus fragmentos onCreateView() . Si hay una excepción no detectada 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 en cuanto a por qué sucedió.

PD. Me acabo de dar cuenta de que esta respuesta está relacionada con @ DaveHubbard, pero utiliza un enfoque diferente para encontrar la causa raíz (registro vs. depurador).

He tenido problemas similares de vez en cuando. El mensaje de error a menudo proporciona muy pocos detalles, independientemente de la causa real. Pero encontré una forma de obtener información más útil. Resulta que la clase interna de Android ‘LayoutInflater.java’ (en el paquete android.view) tiene un método ‘inflar’ que relanza una excepción, pero no recoge los detalles, por lo que se pierde información sobre la causa.

Utilicé AndroidStudio y establecí un punto de interrupción en LayoutInflator línea 539 (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 miras ‘e’ en el depurador, verás un campo de ‘causa’. Puede ser muy útil para darle una pista sobre lo que realmente ocurrió. Así es como, por ejemplo, descubrí que el padre de un fragmento incluido debe tener una identificación, incluso si no se usa en tu código. O que un TextView tenía un problema con una dimensión.

Por si alguien necesita esto. Supuestos: teléfono del dispositivo conectado a un cable USB y su lectura IDE para iniciar la aplicación. Vaya al símbolo del sistema para determinar el problema: ingrese adb logcat

A continuación, inicie su aplicación desde IDE. Tendrás una excepción.

En mi caso: estaba implementando una aplicación de 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 amplía una clase diferente (en este caso, una vista) y no importa todos los constructores requeridos por la clase.

Por ejemplo: public class CustomTextView extiende TextView {}

Esta clase tendría 4 constructores y si se pierde una, se bloqueará. De hecho, me perdí el último que fue utilizado por Lollipop, que añadió ese constructor y funcionó bien.

Enfrenté este problema y lo resolví usando los siguientes códigos. Estaba comenzando la transacción de fragmento usando childfragment manager.

diseño:

   

así es como comencé la transacción de fragmento:

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

Los siguientes códigos explican cómo eliminé el fragmento que se agregó al usar 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; } 

también debemos agregar lo siguiente en build.gradle (app)

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

cada vez que estamos utilizando nuevos diseños o nuevas características de diseño. Espero que esto te ayude.

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

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

Aquí mySeekBar se estableció en nulo (porque me había olvidado de agregar el control en el diseño apropiado) y la siguiente línea llegó a 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 mencionadas anteriormente. Recomendaría el flujo de depuración línea por línea para saber qué está mal.

No sé si esto ayudará.

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

Había establecido el siguiente atributo XML android: textSize = “? Android: attr / textAppearanceLarge”, que no permitía inflar el diseño.

No sé exactamente por qué, ( Todavía soy un poco nuevo en 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 que tan pronto como utilicé el viejo simple @ dimen / md_text_16sp ( que es una costumbre mía ), problema resuelto 🙂

Espero que esto ayude…

Llego un poco tarde a la fiesta, pero ninguna de estas respuestas me ayudó en mi caso. Estaba usando el mapa de Google como SupportMapFragment y PlaceAutocompleteFragment en mi fragmento. Como todas las respuestas apuntaban al hecho de que el problema es que SupportMapFragment es el mapa que se debe recrear y volver a dibujar.

Pero también tuve un problema con PlaceAutocompleteFragment. Así que aquí está la solución de trabajo para aquellos que enfrentan este problema debido a SupportMapFragment y SupportMapFragment

  mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment); FragmentManager fm = getChildFragmentManager(); if (mapFragment == null) { mapFragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit(); fm.executePendingTransactions(); } mapFragment.getMapAsync(this); //Global PlaceAutocompleteFragment autocompleteFragment; if (autocompleteFragment == null) { autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment); } 

Y en onDestroyView borre SupportMapFragment y SupportMapFragment

 @Override public void onDestroyView() { super.onDestroyView(); if (getActivity() != null) { Log.e("res","place dlted"); android.app.FragmentManager fragmentManager = getActivity().getFragmentManager(); android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(autocompleteFragment); fragmentTransaction.commit(); autocompleteFragment = null; } } 

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 el error. Por lo tanto, configurar la “targetSdkVersion” correcta también es importante antes de crear una aplicación de Android.

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

Como otros han mencionado, esto generalmente es causado por un problema nested en el XML en vez de algo que hiciste mal en tu Java. En mi caso, fue un error súper fácil (y estúpido) de arreglar.

Tenía un código como este:

  

Cuando todo lo que tenía que hacer era capitalizar el v en ‘Ver’ para que el sistema lo reconociera. Verifique que sus vistas personalizadas (o fragmentos, recyclerviews, etc.) tengan la statement inicial en mayúscula adecuada para que el autocompletado de XML coincida con la vista adecuada.

Para algunos de ustedes que todavía no han encontrado una solución para esto, en mi caso estaba sucediendo porque tenía un problema OOM (Sin memoria). Esto puede suceder cuando tienes, por ejemplo, una pérdida de memoria en tu aplicación cuando la utilizas durante mucho tiempo. En mi rastro de stack, esta fue 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 ello a pesar de que está anotado TargetApi(21) . Aparentemente, 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 una depuración muy larga, el problema parecía ser que mi MainClass extendía Activity en lugar de FrameActivity, en mi caso, el xml no era un problema. Espero ayudarte

Como se mencionó en una publicación anterior,
rebautizar

 android:name="com.fragment.NavigationDrawerFragment" 

a

 class = "com.fragment.NavigationDrawerFragment" 

Aún así, no funcionó para mí. Luego usé el nombre de la clase sin la parte de com.fragment y funcionó. Así que cámbialo finalmente a

 class = "NavigationDrawerFragment" 

En mi caso .

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

  

etiqueta, eliminarlo lo solucionó.

Intentaba inflar un diseño anterior diseñado para un Actvity en el adaptador de visor de búsqueda.

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 desapareció. Como resultado, mi error se debió a la siguiente “getArguments ();” parte que devolvía nulo.

 Bundle args = getArguments(); 

Al verificar el código de envío de la actividad, me di cuenta de que había cometido un error 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 debería haber usado el fragmento previamente instanciado que ya tenía mi paquete. Entonces 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é exactamente por qué arroja este error en lugar de un NPE, pero esto solucionó mi error en caso de que alguien tenga el mismo escenario

Estaba teniendo el mismo problema, en mi caso el nombre del paquete era incorrecto, arreglarlo resolvió el problema.

Después de mucho tiempo de bashs, así es como resolví el problema después de que ninguna de las respuestas anteriores pudiera hacerlo.

  1. Extienda AppCompatActivity para su actividad Main en lugar de Activity .
  2. Agregue android:theme="@style/Theme.AppCompat.Light" a su en AndroidManifest.xml
  3. En su clase NavigationDrawerFragment , cambie sus instancias de ActionBar a

     ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar(); 

EDITAR

Debe ser una coherencia entre la Actividad y el Diseño . Si el diseño tiene uno de los temas de AppCompat , como Theme.AppCompat.Light , su actividad debería extends AppCompatActivity .

Quería tener el ícono de la hamburguesa y un Cajón de navegación que se parece a la aplicación de Android Gmail , pero terminé con un desagradable Cajón de navegación . Todo eso porque todas mis clases extends Activity lugar de AppCompatActivity .

Volví a factorizar todo el proyecto para extender AppCompatActivity , luego clic con el AppCompatActivity derecho en la Layout Folder , elegí new -> Activity luego Navigation Drawer Activity y Boom, ¡todo está hecho para mí!

Abra gradle.properties y agregue la siguiente línea:

 android.enableAapt2=false 

Referencia: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808