android.view.InflateException: arquivo XML binário: erro ao inflar o fragmento de classe

151

Eu tenho um erro muito frustrante que não consigo explicar. Eu criei um aplicativo Android que usa Android AppCompatpara torná-lo compatível com versões mais antigas. Aqui está o meu principal arquivo de layout de atividade:

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

E aqui está o código principal da minha atividade:

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

O principal problema aqui é: o código acima funciona sem problemas em quase dispositivos (dispositivo estimulado ou alguns dispositivos reais). Mas quando eu executá-lo no Samsung S3. Ele percebe este erro:

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, diga-me como corrigir erro, obrigado :)

hqt
fonte
1
Nesta linha, você está recebendo uma exceção, verifique se o nome da classe e o nome do pacote estão corretos ou não .. android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
kalyan pvs
1
Eu verifiquei e esta classe é verdadeira. Eu posso compilar e executar em alguns dispositivos, mas não no Samsung S3. Eu acho que alguns problemas estranhos aqui :(
hqt
você está certo se ele está executando em algum dispositivo e não na s3 é um conselho problem..my estranho está uma vez tentar usar sherlacFragment chek uma vez ..
kalyan pvs
Já resolvi o problema aqui: stackoverflow.com/a/33128448/4366715 .
Daniel kilinskas
1
Para aqueles que estão tentando diagnosticar a causa desse erro: As correções anedóticas aqui são um arenque vermelho. Há uma exceção anterior ocorrendo durante a inflação do fragmento que não aparece no rastreamento da pilha . Poderia ser qualquer coisa. Para corrigir o problema, você precisa descobrir qual é a exceção anterior. Para fazer isso, veja minha resposta ou @ DaveHubbard's.
LarsH

Respostas:

126

Depois de muito tempo para depuração, corrigi esse problema. (Embora eu ainda não possa explicar o porquê). Que eu mudo de propriedade android:namepara class. (embora no Android Document, eles digam que essas propriedades são iguais, mas funciona !!!)

Portanto, ele deve mudar de:

 android:name="com.fragment.NavigationDrawerFragment"

para

class = "com.fragment.NavigationDrawerFragment"

Portanto, o novo layout deve 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 esta ajuda :)

hqt
fonte
4
Encontrei este problema ao tentar seguir o tutorial oficial do Android. Sua correção (mudar android:idpara class) funcionou para mim. Eu também tenho um aviso Lint à mudança Fragmentpara fragmentque eu fiz.
stevepastelan
9
@ DownVoter: este erro é confuso. E felizmente acho o caminho para consertar. Sinto muito se minha postagem não pode corrigir seu erro, porque também não consigo explicar o porquê. Mas acho que não deve receber uma votação negativa. :)
hqt 25/06
2
Gostaria de saber se você conseguiu essa falha de forma confiável sem mudar de namepara class, alguns usuários relataram essa falha, mas não consigo reproduzi-la pessoalmente!
27415 Daniel Daniel
8
Não funciona para mim. Eu estou tão cansado. 2h de dev e não consegue descobrir por que não funciona (linha de arquivo binária xml ... erro ao inflar o fragmento de classe). Qualquer ideia ?
Cocorico
32

Não consegui resolver o meu problema usando as respostas fornecidas. Finalmente mudei isso:

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

para isso :

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

e funciona.
Se você o estiver usando dentro de um fragmento, use getChildFragmentManager em vez de getSupportFragmentManager .

ReZa
fonte
31

TL / DR : ocorreu uma exceção durante a criação de um fragmento referenciado a partir de um XML de layout de nível superior. Essa exceção causou falha na inflação do layout de nível superior, mas a exceção inicial não foi relatada ; somente a falha de inflação de nível superior aparece no rastreamento da pilha. Para encontrar a causa raiz, você deve capturar e registrar a exceção inicial .


A causa inicial do erro pode ser uma grande variedade de coisas, e é por isso que existem tantas respostas diferentes aqui sobre o que corrigiu o problema para cada pessoa. Para alguns, ele tinha a ver com os id, classou nameatributos. Para outros, foi devido a um problema de permissões ou uma configuração de compilação. Para mim, aqueles não resolveram o problema; em vez disso, havia um recurso desenhável que existia apenas em drawable-ldrtl-xhdpi, e não em um local aplicável como drawable.

Mas esses são apenas detalhes. O problema geral é que a mensagem de erro exibida no logcat não descreve a exceção que iniciou tudo. Quando um XML de layout de nível superior faz referência a um fragmento, o fragmento onCreateView()é chamado. Quando ocorreonCreateView() uma exceção no fragmento (por exemplo, ao inflar o XML do layout do fragmento), ocorre uma falha na inflação do XML do layout de nível superior. Essa falha de inflação de nível superior é o que é relatado como uma exceção nos logs de erros. Mas a exceção inicial não parece viajar pela cadeia o suficiente para ser relatada.

Diante dessa situação, a questão é como expor a exceção inicial, quando ela não aparece no log de erros.

A solução é bem simples: coloque um bloco try/ catchao redor do conteúdo do fragmento onCreateView()e, na catchcláusula, registre a exceção:

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

Pode não ser óbvio para qual classe de fragmento onCreateView()fazer isso e, nesse caso, para cada classe de fragmento usada no layout que causou o problema. Por exemplo, no caso do OP, o código do aplicativo em que a exceção ocorreu foi

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

qual é

   setContentView(R.layout.activity_main);

Portanto, você precisa capturar exceções nos onCreateView()fragmentos mencionados no layout activity_main.

No meu caso, a exceção de causa raiz acabou sendo

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}

Essa exceção não apareceu no log de erros até que eu a peguei onCreateView()e a registrei explicitamente. Uma vez registrado, o problema era fácil de diagnosticar e corrigir ( details_view.xmlexistia apenas na ldrtl-xhdpipasta, por algum motivo). A chave foi capturar a exceção que era a raiz do problema e expô-lo.

Não faz mal fazer isso como um clichê nos métodos de todos os seus fragmentos onCreateView(). Se houver uma exceção não capturada, a atividade será interrompida independentemente. A única diferença é que, se você capturar e registrar a exceção onCreateView(), não ficará no escuro por que isso aconteceu.

PS: Acabei de perceber que esta resposta está relacionada à @ DaveHubbard, mas usa uma abordagem diferente para encontrar a causa raiz (registro versus depurador).

LarsH
fonte
2
Você provavelmente me salvou horas de depuração. Parabéns!
Szymon Sadło
16

Eu tive o mesmo problema, problema, tentei todas as respostas neste tópico sem sucesso. Minha solução foi não ter adicionado um ID no XML da atividade. Eu não pensei que isso importaria, mas importava.

Então, no XML da atividade, eu tinha:

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

Mas deveria ter tido:

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

Se alguém ficaria feliz em comentar o porquê disso, sou todo ouvidos, espero que isso ajude.

Coo
fonte
1
Obrigado, isso funcionou para mim. Eu havia omitido uma identificação por meses, mas depois de algumas mudanças no layout, de repente, comecei a sofrer esse acidente. Android é estranho.
erisco
Você responde funciona para mim. Eu só me pergunto por que devo colocar o atributo id quando não o estou usando em nenhum lugar. Você pode me explicar?
Moshii
12

Pode não ser mais necessário para você, mas se outros leitores acharem útil. Eu tenho exatamente o mesmo android.view.InflateException:...Error inflating class fragment. Eu tinha todas as bibliotecas certas incluídas. Resolvido adicionando mais uma permissão de usuário no AndroidManifest.xmlarquivo<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Btw eu estava correndo Android Studio 0.8.9 on Ubuntu 12.04.

Abu Shumon
fonte
Trabalhou para mim! Muito obrigado!
Dadan
12

Eu tenho o mesmo problema porque não implementei o ouvinte. Veja o seguinte código com /*Add This!*/.

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

Para sua informação, minha classe de fragmento é algo como o seguinte:

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:

Também noto essa mesma mensagem de erro em outras circunstâncias quando há uma exceção na onCreatefunção do Fragment. Eu tenho algo como o seguinte:

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

Por reutilizar esse fragmento, esqueci completamente de definir argumentos. Então o resultado de getArguments()é null. Obviamente, recebo uma nullexceção de ponteiro aqui. Vou sugerir que você fique de olho em erros como esse também.

Yuchen Zhong
fonte
1
Obrigado! Isso ajudou muito!
DLee
8

O seu NavigationDrawerFragment está estendendo o android.support.v4.app.Fragment? Em outras palavras, você está importando o pacote correto?

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

Eu também tive esse problema. Eu o resolvi substituindo a importação MainActivityeNavigationDrawerFragment

De

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

Para

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

Atualizei MainActivitypara estende em ActionBarActivityvez de Atividade

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

Use também ActionBar actionBar = getSupportActionBar();para obter o ActionBar

E atualizei a seguinte função em NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
Fr4nz
fonte
Eu acho que esta é a resposta certa. Mas eu usei AppCompatActivity vez de ActionBarActivity (não obsoleto) e também não remova importação android.app.ActionBar (como uso do método onAttach-lo)
GramThanos
6

Eu enfrentei esse problema e o resolvi usando os seguintes códigos. Eu estava iniciando uma transação de fragmento usando o gerenciador de fragmento de criança.

layout:

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

é assim que eu comecei a transação de fragmento:

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

os seguintes códigos explicam como eu removi o fragmento que foi adicionado 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
fonte
TY Ali. Você salvou meu dia!
Vm345
Funciona bem. Obrigado!
Polyariz
4

Eu tive problemas semelhantes dentro e fora. A mensagem de erro geralmente fornece muito poucos detalhes, independentemente da causa real. Mas encontrei uma maneira de obter informações mais úteis. Acontece que a classe android interna 'LayoutInflater.java' (no pacote android.view) possui um método 'inflar' que lança novamente uma exceção, mas não capta os detalhes, então você perde informações sobre a causa.

Usei o AndroidStudio e defina um ponto de interrupção na linha LayoutInflator 539 (na versão em que estou trabalhando), que é a primeira linha do bloco catch para uma exceção genérica no método 'inflate':

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

Se você observar 'e' no depurador, verá um campo 'causa'. Pode ser muito útil dar uma dica sobre o que realmente ocorreu. Foi assim, por exemplo, que descobri que o pai de um fragmento incluído deve ter um ID, mesmo que não seja usado no seu código. Ou que um TextView teve um problema com uma dimensão.

Dave Hubbard
fonte
3

Apenas no caso de alguém precisar disso. Pressupostos: o telefone do dispositivo está conectado ao cabo USB e sua leitura do IDE para iniciar o aplicativo. Vá para o prompt de comando para determinar o problema: insira adb logcat

Em seguida, inicie seu aplicativo a partir do IDE. Você será uma exceção.

No meu caso: eu estava implantando um aplicativo Android da versão 2.3 em um dispositivo móvel que não suportava o widget "Space"

al881
fonte
3

Esse problema surge quando você tem uma classe personalizada que estende uma classe diferente (nesse caso, uma exibição) e não importa todos os construtores exigidos pela classe.

Por exemplo: public class CustomTextView estende o TextView {}

Essa classe teria quatro construtores e, se você perder alguém, ela falharia. Na verdade, eu perdi o último que foi usado por Lollipop adicionou esse construtor e funcionou bem.

Sagar Devanga
fonte
2

também precisamos adicionar o seguinte em build.gradle (app)

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

sempre que estivermos usando novos layouts ou novos recursos de design. Espero que isso ajude você.

Uma Achanta
fonte
2

Como mencionado em uma postagem anterior,
renomeie

android:name="com.fragment.NavigationDrawerFragment"

para

class = "com.fragment.NavigationDrawerFragment"

Ainda assim, não funcionou para mim. Eu apenas usei o nome da classe sem a parte com.fragment e pronto, funcionou. Então mude finalmente para

class = "NavigationDrawerFragment"
flo west
fonte
2

Depois que nenhuma das respostas aqui me ajudou, optei por executar o aplicativo no modo de depuração, movendo-se por todas as linhas do onCreateView no meu fragmento (NavigationDrawerFragment no seu caso). E percebeu que o fragmento estava tendo dificuldade em inflar por causa de uma NullPointerException. Por exemplo

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

Aqui mySeekBar foi definido como nulo (porque eu tinha deixado de adicionar o controle no layout apropriado) e a próxima linha entrou no NPE, que saiu como InflateException. Além disso, como sugerido acima, renomeie android: name para class.

Esse problema pode surgir por vários motivos mencionados acima. Eu recomendaria o fluxo de depuração linha a linha para saber o que está errado.

Vishy
fonte
E esse erro ocorreu no onCreateView()método de um fragmento ?
LarsH
1

Para alguns de vocês que ainda não encontraram uma solução para isso, no meu caso, isso estava acontecendo porque eu tinha um problema de OOM (falta de memória). Isso pode acontecer quando, por exemplo, há um vazamento de memória no seu aplicativo ao usá-lo por um longo tempo. No meu rastreamento de pilha, esse foi o principal motivo.

Sam Bellerose
fonte
1

Não sei se isso vai ajudar.

Eu tive esse problema com um TextView que eu tinha no layout que estava tentando inflar ( android.view.InflateException: Linha de arquivos XML binários # 45: Erro ao inflar a classe TextView ).

Eu havia definido o seguinte atributo XML android: textSize = "? Android: attr / textAppearanceLarge", que não permitia que o layout fosse inflado.

Não sei exatamente por que ( ainda sou um pouco novo para o Android - menos de um ano de experiência ), pode ter algo a ver com a chamada de atributos do sistema, idk, tudo que sei é que assim que usei @ dimen / md_text_16sp ( que é um costume meu ), problema resolvido :)

Espero que isto ajude...

tl_
fonte
Eu não tinha fragmentos nem atributo android do textSize. Meu erro foi relacionado a um TextInputLayout com um estilo personalizado herdando TextAppearance.AppCompat em vez de Widget.Design.TextInputLayout:. stackoverflow.com/questions/19874882/…
Junior Mayhé 16/06
1

Eu tinha isso em um dispositivo 4.4.2, mas 5+ estava bem. A causa: dentro da inicialização de uma exibição personalizada, eu estava criando um TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes), que é a API 21+.

O Android Studio 2.1 não se queixa, apesar de anotado TargetApi(21). Aparentemente, o Android Studio 2.2 irá corrigir isso e mostrá-lo corretamente como um erro.

Espero que isso ajude alguém.

Tom
fonte
1

Estou um pouco atrasado para a festa, mas nenhuma dessas respostas me ajudou no meu caso. Eu estava usando o mapa do Google como SupportMapFragment e PlaceAutocompleteFragment, ambos no meu fragmento. Como todas as respostas apontaram para o fato de que o problema é o SupportMapFragment ser o mapa a ser recriado e redesenhado.

Mas também tive problemas com o PlaceAutocompleteFragment. Então, aqui está a solução de trabalho para quem está enfrentando esse problema por causa do SupportMapFragment e 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);

    }

E no onDestroyView desmarque as opções SupportMapFragment e 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
fonte
1

Depois de muito tempo de tentativas, foi assim que resolvi o problema depois que nenhuma das respostas acima conseguiu.

  1. Estenda AppCompatActivitysua Mainatividade em vez de Activity.
  2. Adicione android:theme="@style/Theme.AppCompat.Light"ao seu <Activity..../>noAndroidManifest.xml
  3. Na sua NavigationDrawerFragmentclasse, altere suas ActionBarinstâncias para

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

EDITAR

Deve ser uma consistência entre a Atividade e o Layout . Se o Layout tiver um dos Temas AppCompat como Theme.AppCompat.Light, sua Atividade deverá extends AppCompatActivity.

Eu queria ter o ícone do hambúrguer e uma Gaveta de Navegação que se parece com o Android Gmail App , mas acabei com uma Gaveta de Navegação feia . Tudo isso porque todas as minhas aulas em extends Activityvez de AppCompatActivity.

Eu refatorei todo o projeto para estender AppCompatActivity, clique com o Layout Folderbotão direito do mouse em , escolha new-> Activitythen Navigation Drawer Activitye Boom, tudo está feito por mim!

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

A visualização pode ser qualquer coisa que não esteja sendo inflada; esse tipo de erro ocorre quando há um conflito na resolução dos nomes de classe ou atributo de nome de uma visualização referida no arquivo XML.

Quando eu recebo o mesmo erro, deixei tudo limpo e seguro no arquivo XML da interface do usuário, a exibição que eu estava 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"/>

Eu estava usando um atributo de estilo que estava se referindo à propriedade Componentes de materiais. Mas meu styles.xml tinha ...

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

Onde a resolução de classe estava enfrentando o conflito. Meus atributos de exibição referiram uma propriedade que não foi definida no tema do meu aplicativo. O tema pai certo dos componentes materiais me ajudou. Então mudei o atributo pai para ...

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

O que resolveu o problema.

Shrinivas Manjithaya
fonte
0

Eu acho que o problema básico é com "android: targetSdkVersion", que é definido no AndroidManifest.xml. No meu caso, o valor inicial que defini como:

android:targetSdkVersion=16

Eu mudei para:

android:targetSdkVersion=22

que resolveu todos os meus erros. Portanto, a configuração da "targetSdkVersion" correta também é importante antes da criação de um aplicativo Android.

Sanjeev
fonte
0

Caso outra pessoa venha aqui e as respostas não ajudem a resolver o problema, mais uma coisa a tentar.

Como outros já mencionaram, isso geralmente é causado por um problema aninhado no XML em vez de algo que você fez de errado no Java. No meu caso, foi um erro super fácil (e estúpido) de corrigir.

Eu tinha um código como este:

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

Quando tudo o que eu precisava fazer era colocar em maiúscula o v em 'View' para que o sistema o reconhecesse. Verifique se suas exibições personalizadas (ou fragmentos, recyclerviews, etc.) possuem a declaração em maiúscula apropriada, para que o preenchimento automático do XML corresponda à exibição apropriada.

PGMacDesign
fonte
0

Também tive esse erro e, depois de muito tempo depurando, o problema parecia que minha MainClass estendeu a Activity em vez de FrameActivity, no meu caso, o xml não era um problema. Espero ajudá-lo.

Copacel
fonte
0

No meu caso .

O layout que eu estava tentando inflar tinha

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

removê-lo e corrigi-lo.

Eu estava tentando inflar um layout anterior projetado para um Actvity no adaptador de visualização de pager.

mughil
fonte
0

Meu erro foi causado por um problema diferente.

Eu estava passando um pacote de uma atividade para seu fragmento. Quando comentei o código que recebeu o pacote no fragmento, o erro se foi. Como se viu, meu erro ocorreu devido ao abaixo "getArguments ();" parte que estava retornando nula.

Bundle args = getArguments();

Ao verificar o código de envio da atividade, percebi que havia um erro bobo no abaixo;

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

Eu estava criando um NOVO fragmento na linha com a seta. Considerando que eu deveria ter usado o fragmento pré-instanciado que já tinha meu pacote. Então deveria ter 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();

Não sei por que exatamente ele lança esse erro em vez de um NPE, mas isso resolveu meu erro no caso de alguém estar tendo o mesmo cenário

Amgad
fonte
0

Eu estava tendo o mesmo problema, no meu caso o nome do pacote estava errado, corrigindo-o resolveu o problema.

Tincho825
fonte
0

Eu tive esse erro quando tive meu RecyclerView na raiz do meu fragment.xml,

mas quando envolvi-o com um ViewGroup, o aplicativo funcionou bem.

7odafarghal
fonte
0

Adicione este campo de nome na navegação

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
fonte