Tengo un error muy frustrante que no puedo explicar. Creé una aplicación de Android que la usa Android AppCompat
para hacerla compatible con versiones anteriores. Aquí está mi archivo de diseño 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 se ejecuta sin problemas en casi dispositivos (dispositivo estimulado 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 solucionar el error, gracias :)
Respuestas:
Después de mucho tiempo para la depuración, he solucionado este problema. (Aunque todavía no puedo explicar por qué). Ese cambio de propiedad
android:name
aclass
. (aunque en Android Document, dicen que esas propiedades son las mismas, ¡pero funciona!)Entonces, debería cambiar de:
a
Entonces, el nuevo diseño debe ser:
Espero que esto ayude :)
fuente
android:id
aclass
) funcionó para mí. También me dio una advertencia pelusa al cambioFragment
afragment
, lo que hice.name
aclass
, he tenido algunos usuarios que informan este bloqueo, ¡pero no puedo reprobarlo yo mismo!No pude resolver mi problema usando las respuestas proporcionadas. Finalmente cambié esto:
a esto :
,
y funciona.
Si lo está utilizando dentro de un fragmento, use getChildFragmentManager en lugar de getSupportFragmentManager .
fuente
TL / DR : se produjo una excepción durante la creación de un fragmento al que se hace referencia desde un diseño XML de nivel superior. Esta excepción hizo que la inflación de diseño de nivel superior fallara, pero la excepción inicial no se informó ; solo la falla de inflación de nivel superior aparece en la traza de la pila. Para encontrar la causa raíz, debe atrapar 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 lo que solucionó el problema para cada persona. Para algunos, que tenía que ver con las
id
,class
oname
atributos. Para otros, se debió a un problema de permisos o una configuración de compilación. Para mí, eso no solucionó el problema; en cambio, había un recurso extraíble que solo existía endrawable-ldrtl-xhdpi
lugar de en un lugar aplicable comodrawable
.Pero esos son solo detalles. El problema general 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,
onCreateView()
se llama al fragmento . Cuando se produceonCreateView()
una excepción en un fragmento (por ejemplo, al inflar el XML de diseño del fragmento), la inflación del XML de diseño de nivel superior falla. 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 por la cadena lo suficientemente bien como para ser reportada.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 fragmentoonCreateView()
y, en lacatch
cláusula, registre la excepción:Puede no ser obvio a qué clase de fragmento
onCreateView()
hacer esto, en cuyo caso, hacerlo a cada clase de fragmento que se utiliza en el diseño que causó el problema. Por ejemplo, en el caso del OP, el código de la aplicación donde ocurrió la excepción fuecual es
Por lo tanto, debe detectar excepciones en
onCreateView()
cualquier fragmento al que se haga referencia en el diseñoactivity_main
.En mi caso, la excepción de causa raíz resultó ser
Esta excepción no apareció en el registro de errores hasta que lo
onCreateView()
capté y lo registré explícitamente. Una vez que se registró, el problema fue bastante fácil de diagnosticar y corregir (details_view.xml
existía solo bajo laldrtl-xhdpi
carpeta, por alguna razón). La clave fue detectar la excepción que era la raíz del problema y exponerlo.No hace daño hacer esto como repetitivo en todos los
onCreateView()
métodos de tus fragmentos . Si hay una excepción no detectada allí, bloqueará la actividad independientemente. La única diferencia es que si detecta y registra la excepciónonCreateView()
, no estará en la oscuridad de por qué sucedió.PD: Acabo de darme cuenta de que esta respuesta está relacionada con la de @ DaveHubbard, pero utiliza un enfoque diferente para encontrar la causa raíz (registro frente a depurador).
fuente
Tuve el mismo problema, problema, probé todas las respuestas en este hilo en vano. Mi solución fue que no había agregado una identificación en el XML de la actividad. No pensé que importaría, pero lo hizo.
Entonces, en el XML de la actividad tuve:
Pero debería haber tenido:
Si alguien estaría feliz de comentar por qué esto es así, soy todo oídos para otros, espero que esto ayude.
fuente
Puede que ya no sea necesario para ti, pero si otros lectores lo encuentran útil. Tengo exactamente lo mismo
android.view.InflateException:...Error inflating class fragment
. Tenía todas las bibliotecas correctas incluidas. Resuelto agregando un permiso de usuario más en elAndroidManifest.xml
archivo, es decir<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Por cierto estaba corriendo
Android Studio 0.8.9 on Ubuntu 12.04.
fuente
Tengo el mismo problema porque no implementé el oyente. Vea el siguiente código con
/*Add This!*/
.FYI, mi clase de fragmentos es algo como lo siguiente:
Editar:
También noto este mismo mensaje de error en otras circunstancias cuando hay una excepción en la
onCreate
función delFragment
. Tengo algo como lo siguiente:Como reutilizo este fragmento, me olvido por completo de establecer argumentos. Entonces el resultado de
getArguments()
esnull
. Obviamente, obtengo unanull
excepción de puntero aquí. Te sugiero que también vigiles errores como este.fuente
¿Su NavigationDrawerFragment está extendiendo android.support.v4.app.Fragment? En otras palabras, ¿estás importando el paquete correcto?
fuente
También tuve este problema. Lo resolví reemplazando la importación en
MainActivity
yNavigationDrawerFragment
De
A
Actualicé
MainActivity
a extend enActionBarActivity
lugar de ActivityTambién usar
ActionBar actionBar = getSupportActionBar();
para obtener la barra de accionesY actualicé la siguiente función en
NavigationDrawerFragment
fuente
Me enfrenté a este problema y lo resolví usando los siguientes códigos. Estaba comenzando una transacción fragmentada usando el administrador de fragmentos de niños.
diseño:
así es como comencé a fragmentar la transacción:
Los siguientes códigos explican cómo eliminé el fragmento que agregué usando childfragmentmanger.
fuente
He tenido problemas similares por intervalos. El mensaje de error a menudo proporciona muy pocos detalles, independientemente de la causa real. Pero encontré una manera 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 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 'inflar':
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, descubrí que el padre de un fragmento incluido debe tener una identificación, incluso si no se usa en su código. O que un TextView tenía un problema con una dimensión.
fuente
Por si alguien necesita esto. Suposiciones: teléfono del dispositivo conectado al cable USB y su lectura IDE para iniciar la aplicación. Vaya al símbolo del sistema para determinar el problema: ingrese adb logcat
Luego inicie su aplicación desde IDE. Serás una excepción.
En mi caso: estaba implementando una aplicación de Android de la Versión 2.3 en un dispositivo móvil que no era compatible con el widget "Space"
fuente
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: clase pública CustomTextView extiende TextView {}
Esta clase tendría 4 constructores y si se pierde alguno, se bloqueará. De hecho, me perdí el último que fue utilizado por Lollipop, agregó ese constructor y funcionó bien.
fuente
también debemos agregar lo siguiente en build.gradle (aplicación)
cada vez que usamos nuevos diseños o nuevas características de diseño. Espero que esto te ayude.
fuente
Como se mencionó en una publicación anterior,
cambie el nombre
a
Aún así, no funcionó para mí. Luego simplemente usé el nombre de la clase sin la parte com fragment y listo, funcionó. Así que cámbielo finalmente a
fuente
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 dificultades para inflarse debido a una NullPointerException. P.ej
Aquí mySeekBar se configuró en nulo (porque había perdido agregar el control en el diseño apropiado) y la siguiente línea entró en NPE que salió como InflateException. Además, como se sugirió anteriormente, cambie el nombre de android: name a class.
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.
fuente
onCreateView()
método de un fragmento ?Para algunos de ustedes que aún 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 tiene, por ejemplo, una pérdida de memoria en su aplicación cuando la usa durante mucho tiempo. En mi seguimiento de la pila, esta fue la razón principal.
fuente
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: línea de archivo XML binario # 45: Error al inflar la clase TextView ).
Había establecido el siguiente atributo XML android: textSize = "? Android: attr / textAppearanceLarge" que no permitía que el diseño se inflara.
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 tan pronto como usé el viejo @ dimen / md_text_16sp ( que es una costumbre mía ), problema resuelto :)
Espero que esto ayude...
fuente
Widget.Design.TextInputLayout
:. stackoverflow.com/questions/19874882/…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)
API 21+.Android Studio 2.1 no se queja de ello aunque esté anotado
TargetApi(21)
. Aparentemente, Android Studio 2.2 corregirá esto y lo mostrará correctamente como un error.Espero que esto ayude a alguien.
fuente
Llego un poco tarde a la fiesta, pero ninguna de estas respuestas me ayudó en mi caso. Yo estaba usando Google Map como SupportMapFragment y PlaceAutocompleteFragment tanto en mi fragmento. Como todas las respuestas apuntaban al hecho de que el problema es que SupportMapFragment es el mapa a recrear y volver a dibujar.
Pero también tuve problemas con PlaceAutocompleteFragment. Así que aquí está la solución de trabajo para aquellos que enfrentan este problema debido a SupportMapFragment y SupportMapFragment
Y en onDestroyView borre SupportMapFragment y SupportMapFragment
fuente
Después de mucho tiempo de intentos, así es como resolví el problema después de que ninguna de las respuestas anteriores pudo.
AppCompatActivity
suMain
actividad en lugar deActivity
.android:theme="@style/Theme.AppCompat.Light"
a su<Activity..../>
en elAndroidManifest.xml
En su
NavigationDrawerFragment
clase, cambie susActionBar
instancias aEDITAR
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íaextends AppCompatActivity
.Quería tener el icono de la hamburguesa y un cajón de navegación que se parece a la aplicación Gmail de Android , pero terminé con un feo cajón de navegación . Todo eso porque todas mis clases en
extends Activity
lugar deAppCompatActivity
.Refactoré todo el proyecto para extenderlo
AppCompatActivity
, luego hice clic derecho en elLayout Folder
, elegínew
->Activity
luegoNavigation Drawer Activity
y Boom, ¡todo está hecho para mí!fuente
La vista puede ser cualquier cosa que no se infla, este tipo de error se produce cuando hay un conflicto al resolver los nombres de clase o el atributo de nombre de una vista referida en el archivo XML.
Cuando recibo el mismo error, acabo de tener todo limpio y seguro en el archivo UI-XML, la vista que estaba usando,
Estaba usando un atributo de estilo que se refería a la propiedad Componentes del material. Pero mi styles.xml tenía ...
Donde la clase resolviendo enfrentaba el conflicto. Mis atributos de vista hacían referencia a una propiedad que no estaba definida en el tema de mi aplicación. El tema principal correcto de los componentes materiales me ayudó. Entonces cambié el atributo padre a ...
Lo que resolvió el problema.
fuente
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ó mi todo el error. Por lo tanto, configurar la "targetSdkVersion" correcta también es importante antes de crear una aplicación de Android.
fuente
En caso de que alguien más venga aquí y las respuestas no ayuden a resolver el problema, una cosa más para intentar.
Como otros han mencionado, esto generalmente es causado por un problema anidado en el propio XML en lugar 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 poner en mayúscula la v en 'Ver' para que el sistema la reconociera. Verifique que sus vistas personalizadas (o fragmentos, vistas de reciclado, etc.) tengan la declaración en mayúscula apropiada por adelantado para que el autocompletado XML coincida con la vista apropiada.
fuente
También tuve este error, y después de una depuración muy larga, el problema parecía ser que mi MainClass extendió la Actividad en lugar de FrameActivity, en mi caso, el xml no fue un problema. Espero poder ayudarte.
fuente
En mi caso .
El diseño que estaba tratando de inflar tenía
etiqueta, quitándolo lo arregló.
Estaba tratando de inflar un diseño anterior diseñado para una Actvity en el adaptador de visor de buscapersonas.
fuente
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ó al siguiente "getArguments ();" parte que estaba volviendo nula.
Al comprobar el código de envío de la actividad, me di cuenta de que había un error tonto en el siguiente;
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:
No sé por qué exactamente arroja este error en lugar de un NPE, pero esto resolvió mi error en caso de que alguien tenga el mismo escenario
fuente
Estaba teniendo el mismo problema, en mi caso el nombre del paquete era incorrecto, solucionarlo solucionó el problema.
fuente
Abra gradle.properties y agregue la siguiente línea:
Referencia: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808
fuente
Tuve este error cuando tuve mi RecyclerView en la raíz de mi fragment.xml,
pero cuando lo envolví con un ViewGroup, la aplicación funcionó bien.
fuente
Agregar este campo de nombre en la navegación
fuente