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

151

Tengo un error muy frustrante que no puedo explicar. Creé una aplicación de Android que la usa Android AppCompatpara 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 :)

hqt
fuente
1
En esta línea, obtendrá una verificación de excepción si el nombre de la clase y el nombre del paquete son correctos o no ... android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
kalyan pvs
1
Lo he comprobado y esta clase es verdadera. Puedo compilar y ejecutar en algunos dispositivos, pero no en Samsung S3. Creo que algunos problemas extraños aquí :(
hqt
tiene razón si se está ejecutando en algún dispositivo y no en s3, es un problema extraño ... mi consejo es que una vez intente usar sherlacFragment chek una vez ...
kalyan pvs
Ya resolví el problema aquí: stackoverflow.com/a/33128448/4366715 .
daniel kilinskas
1
Para aquellos que intentan diagnosticar la causa de este error: las soluciones anecdóticas aquí son una pista falsa. Hay una excepción previa que ocurre durante el inflado del fragmento que no aparece en la traza de la pila . Podría ser cualquier cosa. Para solucionar el problema, debe averiguar cuál es la excepción anterior. Para hacer eso, vea mi respuesta o la de @ DaveHubbard.
LarsH

Respuestas:

126

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:namea class. (aunque en Android Document, 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 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 :)

hqt
fuente
44
Me encontré con este problema al intentar seguir el tutorial oficial de Android. Su solución (cambio android:ida class) funcionó para mí. También me dio una advertencia pelusa al cambio Fragmenta fragment, lo que hice.
stevepastelan
9
@DownVoter: este error es confuso. Y afortunadamente encuentro la manera de arreglarlo. Lamento mucho si mi publicación no puede solucionar su error porque tampoco puedo explicar por qué. Pero creo que no debería recibir un voto negativo. :)
hqt
2
Me pregunto si obtuviste este bloqueo de manera confiable sin cambiar de namea class, he tenido algunos usuarios que informan este bloqueo, ¡pero no puedo reprobarlo yo mismo!
Daniel Wilson
8
No funciona para mi Estoy tan cansado. 2 horas de desarrollo y no puedo encontrar por qué no funciona (línea de archivo binario xml ... error al inflar el fragmento de clase). Alguna idea ?
Cocorico
32

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 de un fragmento, use getChildFragmentManager en lugar de getSupportFragmentManager .

ReZa
fuente
31

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, classo nameatributos. 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 en drawable-ldrtl-xhdpilugar de en un lugar aplicable como drawable.

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/ catchalrededor del contenido del fragmento onCreateView()y, en la catchcláusula, 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 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 fue

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

cual es

   setContentView(R.layout.activity_main);

Por lo tanto, debe detectar excepciones en onCreateView()cualquier fragmento al que se haga referencia en el diseño 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()capté y lo registré explícitamente. Una vez que se registró, el problema fue bastante fácil de diagnosticar y corregir ( details_view.xmlexistía solo bajo la ldrtl-xhdpicarpeta, 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ón onCreateView(), 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).

LarsH
fuente
2
Probablemente me ahorraste horas de depuración. ¡Prestigio!
Szymon Sadło
16

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:

<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 estaría feliz de comentar por qué esto es así, soy todo oídos para otros, espero que esto ayude.

Arrullo
fuente
1
Gracias, esto funcionó para mí. Había estado omitiendo una identificación durante meses, pero después de algunos cambios de diseño de repente comencé a tener este bloqueo. Android es raro
erisco
Tu respuesta funciona para mí. Solo me pregunto por qué supongo que debo poner el atributo id cuando no lo estoy usando en ningún lado. ¿Me puedes explicar?
Moshii
12

Puede que ya no sea necesario para ti, pero si otros lectores lo encuentran útil. Tengo exactamente lo mismoandroid.view.InflateException:...Error inflating class fragment . Tenía todas las bibliotecas correctas incluidas. Resuelto agregando un permiso de usuario más en el AndroidManifest.xmlarchivo, es decir<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Por cierto estaba corriendo Android Studio 0.8.9 on Ubuntu 12.04.

Abu Shumon
fuente
¡Trabajó para mi! ¡Muchas gracias!
Dadan
12

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 noto este mismo mensaje de error en otras circunstancias cuando hay una excepción en la onCreatefunción 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 por completo de establecer argumentos. Entonces el resultado de getArguments()es null. Obviamente, obtengo una nullexcepción de puntero aquí. Te sugiero que también vigiles errores como este.

Yuchen Zhong
fuente
1
¡Gracias! ¡Esto ayudó mucho!
DLee
8

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

import android.support.v4.app.Fragment;
Wang
fuente
6

También tuve este problema. Lo resolví reemplazando la importación enMainActivity yNavigationDrawerFragment

De

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

A

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

Actualicé MainActivitya extend en ActionBarActivitylugar de Activity

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

También usar ActionBar actionBar = getSupportActionBar(); para obtener la barra de acciones

Y actualicé la siguiente función en NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
Fr4nz
fuente
Creo que esta es la respuesta correcta. Pero usé AppCompatActivity en lugar de ActionBarActivity (no en desuso) y tampoco elimino import android.app.ActionBar (como el método onAttach lo usa)
GramThanos
6

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:

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

así es como comencé a fragmentar la transacción:

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

Los siguientes códigos explican cómo eliminé el fragmento que agregué 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;
    }
Ali Gürelli
fuente
TY Ali. ¡Me salvaste el día!
vm345
Funciona bien. ¡Gracias!
Polyariz
4

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

        } 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, 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.

Dave Hubbard
fuente
3

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"

al881
fuente
3

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.

Sagar Devanga
fuente
2

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

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

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

Uma Achanta
fuente
2

Como se mencionó en una publicación anterior,
cambie el nombre

android:name="com.fragment.NavigationDrawerFragment"

a

class = "com.fragment.NavigationDrawerFragment"

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

class = "NavigationDrawerFragment"
Flo West
fuente
2

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

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

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.

Vishy
fuente
¿Y se produjo este error en el onCreateView()método de un fragmento ?
LarsH
1

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.

Sam Bellerose
fuente
1

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

tl_
fuente
No tenía fragmentos ni el atributo textSize de Android. Mi error estaba relacionado con un TextInputLayout con un estilo personalizado que hereda TextAppearance.AppCompat en lugar de Widget.Design.TextInputLayout:. stackoverflow.com/questions/19874882/…
Junior Mayhé
1

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.

Tom
fuente
1

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

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


}
Ratul Bin Tazul
fuente
1

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

  1. Amplíe AppCompatActivitysu Mainactividad en lugar de Activity.
  2. Añadir android:theme="@style/Theme.AppCompat.Light"a su <Activity..../>en elAndroidManifest.xml
  3. En su NavigationDrawerFragmentclase, cambie sus ActionBarinstancias 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 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 Activitylugar de AppCompatActivity.

Refactoré todo el proyecto para extenderlo AppCompatActivity, luego hice clic derecho en el Layout Folder, elegí new-> Activityluego Navigation Drawer Activityy Boom, ¡todo está hecho para mí!

Yahya
fuente
1
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar

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,

   <com.google.android.material.bottomappbar.BottomAppBar
    android:id="@+id/bottomAppBar"
    style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:hideOnScroll="true"
    app:menu="@menu/bottom_app_bar"
    app:navigationIcon="@drawable/ic__menu_24"/>

Estaba usando un atributo de estilo que se refería a la propiedad Componentes del material. Pero mi styles.xml tenía ...

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>

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

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>

Lo que resolvió el problema.

Shrinivas Manjithaya
fuente
0

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.

Sanjeev
fuente
0

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:

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

PGMacDesign
fuente
0

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.

Copacel
fuente
0

En mi caso .

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

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

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.

mughil
fuente
0

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.

Bundle args = getArguments();

Al comprobar el código de envío de la actividad, me di cuenta de que habí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 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é 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

Amgad
fuente
0

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

Tincho825
fuente
0

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.

7odafarghal
fuente
0

Agregar este campo de nombre en la navegación

android: name = "androidx.navigation.fragment.NavHostFragment"

   <fragment
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:name="androidx.navigation.fragment.NavHostFragment"
             app:navGraph="@navigation/navigation"
             app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
             app:layout_constraintTop_toTopOf="parent">
jai khambhayta
fuente