Erro ao inflar o fragmento de classe

161

Eu recebo o erro

Unable to start activity ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment

quando alterno pelo modo retrato e paisagem. Estou usando fragmentos. Meu xml é:

 <LinearLayout android:id="@+id/mainLayout"
               android:orientation="horizontal"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content" >

    <ListView android:id="@+id/android:list"
              android:layout_height="wrap_content"
              android:layout_width="fill_parent"/> 

    <fragment android:id="@+id/fragmentDetails"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent"
              class="de.androidbuch.activiti.task.TaskDetailsFragment"/> 
</LinearLayout>

Se eu mudar pelo modo paisagem e retrato, tudo funcionará bem. Mas quando clico no meu fragmento (e consigo ver o meu fragmento) e depois alterno para o outro modo, recebo o erro. Alguma idéia de como eu posso resolver isso? Encontrei algumas respostas aqui, mas nenhuma delas me ajudou ...

06-21 14:55:05.600: ERROR/AndroidRuntime(7636): FATAL EXCEPTION: main
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): java.lang.RuntimeException: Unable to start activity         
ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}:   android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3097)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.access$1600(ActivityThread.java:123)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:997)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Looper.loop(Looper.java:126)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.main(ActivityThread.java:3998)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invokeNative(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invoke(Method.java:491)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at dalvik.system.NativeStart.main(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:727)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:227)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Activity.setContentView(Activity.java:1771)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at de.androidbuch.activiti.task.TaskActivity.onCreate(TaskActivity.java:83)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     ... 12 more
tsync
fonte
Você mantém arquivos de layout separados nas pastas de layout e de layout-land?
Nathan Fig
Você pode fornecer o log de erros completo, incluindo as linhas após "Não foi possível iniciar a atividade ..."
Dave
@ Nathan Fig: sim, eu faço .. mas recebendo os erros ..
TSYNC
@ Dave: aqui vai você .. alguma idéia?
21811 tsync
Precisa de um código de layout de paisagem, e também úteis seriam suas chamadas para setContentView e também como você está disparando atividades no modo retrato, como suponho que você esteja. No momento, não parece haver informações suficientes. Observar o exemplo do FragmentLayout nas demonstrações da API pode ajudá-lo, pois parece que você está fazendo algo semelhante.
PJL

Respostas:

131

Como o hdemirchian disse, certifique-se de usar:

import android.support.v4.app.Fragment;

E também verifique se a Atividade que está usando o (s) fragmento (s) se estende em FragmentActivityvez do regular Activity,

import android.support.v4.app.FragmentActivity;

para pegar a FragmentActivityaula.

Dandre Allison
fonte
12
Isso foi muito votado, mas para mim ele falha ao reiniciar o aplicativo, e eu já estou usando o fragmento v4 e o frscementActivity v4 - para ser mais preciso AppCompatActivity.
joseph
4
Isso não é solução. importar android.support.v4.app.Fragment; não muda nada. Na verdade, é até importação não utilizada e desnecessária.
F470071 de 04/11
7
Obrigado, uma observação lateral é que AppCompatActivity é um descendente de FragmentActivity.
abedfar
mas eu estou usando o fragmento adaga e espada fragmento sempre alargar fragmento não atividade fragmento
user3475052
96

A exceção android.view.InflateException: Binary XML file line: #... Error inflating class fragmentpode acontecer se você manipular getActivity()dentro do seu fragmento antes de onActivityCreated()ser chamado. Nesse caso, você recebe uma referência de atividade incorreta e não pode confiar nela.

Por exemplo, o próximo padrão está errado:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) 
{
    final View view = inflater.inflate(R.layout..., container, false);

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...); - another problem: button is null

    return view;
}

Padrão correto # 1

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) 
{
    final View view = inflater.inflate(R.layout..., container, false);

    Button button = view.findViewById(R.id...);
    button.setOnClickListener(...);

    return view;
}

Padrão correto # 2

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...);
}
Grigori A.
fonte
@MaximKorobov Você pode chamar getActivity()dentro onActivityCreated()ou em qualquer método de ciclo de vida subsequente, mas antes onDestroyView().
Grigori A.
Muito obrigado, isso ajudou imensamente!
Shotgun Ninja
Thanks :-) isso me salvou um monte de tempo :)
user1007522
Eu adoraria descobrir mais sobre isso, estou tendo um acidente esporádico e acho que esse pode ser o problema. Embora na maioria das vezes o código funcione bem, é difícil saber
Daniel Wilson
O padrão 2 pode ter resolvido isso para mim. Dedos cruzados. Obrigado por isso.
joseph
36

Eu tive o mesmo erro. Eu estava cavando o dia todo, não sei, mas acho que tentei ~ 25 soluções para esse problema. Nenhum funcionou até às 02:00, descobri que estava faltando essa linha no manifesto de aplicativos xml:

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

Essa linha estava dentro da <application>etiqueta. Eu realmente espero que isso ajude alguém. GL.

Matiss
fonte
3
Meu heroi. Pessoas como você são tão boas!
Capdagon
5
Explique o que está acontecendo, por favor. Qual é o benefício dessa linha?
Mansour Fahad
2
Obrigado, salve o meu dia. Cada amostra do uso do mapa do Google no Android funciona de maneira diferente, gostaria de saber se existe um padrão.
user2812866
22

Eu tive o mesmo problema. A solução para mim foi a ordem de super.onCreate e setContentView dentro do FragmentActivity

A ordem a seguir funciona bem:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);
Wilko
fonte
3
Por que isso corrige?
Spencer
1
Em um método JAVA, supersempre deve ser chamado no início do método.
Stéphane Bruckert 14/03
11
@ StéphaneBruckert nem sempre é o caso que super.method()deve ser chamado primeiro. Depende do que o método da superclasse faz. No caso FragmentActivity, faz alguma inicialização necessária para fazer o setContentViewtrabalho corretamente. No entanto, em outro método (digamos onKeyUp), você pode querer fazer algum trabalho condicional com a ação, mas, super.onKeyUpnesse caso, você provavelmente desejará chamar super.onKeyUpno final da função.
CoatedMoose
Provavelmente também vale a pena notar que super()(o construtor da superclasse) deve ser a primeira função chamada em qualquer construtor de classes filho, no entanto, chamá-lo não é necessariamente obrigatório (dependeria inteiramente da extensão da classe).
CoatedMoose
17

Fragmentos não podem ser aninhados em XML

Aprendi isso da maneira mais difícil - se você aninhar uma <fragment>tag baseada em layout XML dentro de um fragmento (potencialmente) carregado dinamicamente FragmentManager, então você começa a receber erros estranhos, tentando aumentar o seu fragmento xml.

Acontece que isso não é suportado - funcionará bem se você fizer isso apenas com a FragmentManagerabordagem.

Eu estava tendo esse problema porque estava tentando carregar um fragmento dentro de um <DrawerLayout>xml, e isso estava causando uma falha no onCreateView()método quando coloquei a pilha de trás.

Dhiraj Gupta
fonte
Isso ainda não é suportado? A partir deappcompat-v7:23.3.0
thanassis
sim, estou aninhando fragmento dentro de xml. Vou analisar isso.
KDeogharkar
Mas existe soluções / hacks para o problema: stackoverflow.com/a/14695397/860488
Morten Holmgaard
2
Veja a nota no final desta seção para confirmação: developer.android.com/about/versions/…
Philippe
não sei por que a solução é tão simples. para mim, apenas substituindo <fragment>por <frameLayout>trabalhado. Eu ainda estou descobrindo. - stackoverflow.com/a/19167009/5477548
yoad w
16

Eu estava tendo o mesmo problema que você está enfrentando. Nenhuma das dicas no topo me ajudou. Mais tarde, descobri que tudo o que precisava fazer era corrigir minhas importações de:

import android.app.Fragment;

para:

import android.support.v4.app.Fragment;
hdemirchian
fonte
Obrigado, esta solução funcionou para mim também. Eu estava lutando com esse problema por 2 dias. Finalmente a solução funcionou para me.thanks hdemirchian ..
Lakshmanan
Você é demais! Meu problema era o oposto - o assistente Fragment importa android.support.v4.app.Fragment por padrão. E minha principal atividade estende android.app.Activity.
Industrial Control Freak
12

Você tentou:

 <fragment
            android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
Blundell
fonte
1
Você mostrou-nos um arquivo xml, mas você deve ter 2 um em / layout / e um no layout-land /
Blundell
12

Verifique se não há nenhuma exceção gerada no método onCreateView do fragmento. Se alguma exceção for gerada nesse método, o logcat não mostrará detalhes exatos da exceção, mas sempre exibirá a mensagem:

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.fragment" 
on path: DexPathList[[zip file "/data/app/com.package/base.apk"],
nativeLibraryDirectories=[/data/app/com.package/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
Lei
fonte
Apenas para adicionar o que a Lei está dizendo, experimente pegar o código na sua oncreateview e descubra a causa raiz real. Obrigado Lei!
Swaroop
6

Se você estiver TaskDetailsFragmentestendendo android.app.Fragment, mude onCreateView().

Retorne sua visualização que deseja mostrar no Fragmento ou converta seu Layout para visualização usando LayoutInflater e retorne-o.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View mainview = inflater.inflate(R.layout.main, null);
    return mainview;
}

Espero que isso funcione. :)

Suryavel TR
fonte
6

Verifique o caminho da classe; pode ser que o inflador de visualização não encontre sua definição de classe, conforme definido em seu xml class = "de.androidbuch.activiti.task.TaskDetailsFragment" o caminho acima pode estar errado.

mascarar
fonte
6

Eu estava recebendo esse erro por diferentes razões.

Passos para reproduzir:

~> Meu problema foi que eu criei um novo aplicativo em branco.

~> Eu gerei um fragmento personalizado no menu Arquivo ~> Novo arquivo.

~> Prosseguiu para personalizar o fragmento adicionando layouts e botões, etc.

~> Referenciei o novo fragmento customizado no activity_my.xml gerado automaticamente, que foi gerado para mim ao criar o aplicativo. Fazer isso permitiu que o XML gerasse os objetos para mim.

Aqui está o problema ao gerar o fragmento personalizado através do menu Arquivo ~> Novo arquivo, ele gera automaticamente um esboço de função de interface e o coloca na parte inferior do arquivo de classe de fragmento.

Isso significa que sua classe MyActivity deve implementar essa interface. Caso contrário, o erro acima ocorre apenas ao fazer referência ao fragmento do xml. Removendo completamente a referência para o fragmento no XML e criando o fragmento através do código no arquivo de classe MyActivity.java, o Logcat gera um erro mais conciso, explicando o problema em detalhes e reclamando da interface. Isso é demonstrado na atividade do modelo de projeto + fragmento. Embora esse modelo de projeto não gere o stub da interface.

xMythicx
fonte
5

Para mim, foi depois de rolar o rastreamento de pilha que encontrei na falta da permissão para android.permission.ACCESS_NETWORK_STATE

depois de adicionar essa permissão, foi corrigido

Gil
fonte
1
Não to self: "Percorra a inteira . Rastreamento de pilha Obrigado @Gil.
Batandwa
4

Se você tiver arquivos de layout separados para os modos retrato e paisagem e estiver recebendo um erro de inflação sempre que alterar a orientação após clicar em um item, é provável que haja uma discrepância entre os arquivos de layout.

Quando você recebe o erro, é apenas quando você clica no item no modo paisagem ou apenas no modo retrato ou em ambos? Sua atividade TaskDetailsFragment usa um arquivo de layout que pode ter discrepâncias entre os modos paisagem e retrato?

Nathan Fig
fonte
Obrigado pela sua resposta .. bem, eu só tenho um fragmento no modo paisagem e não no modo retrato. Então, eu posso clicar apenas no modo paisagem para ver o fragmento. E depois de eu mudar novamente para o modo paisagem Eu recebo este erro ...
TSYNC
Esse é quase certamente o problema: você tem uma visualização no modo retrato que não pode ser encontrada no modo paisagem. Adicionar o fragmento à paisagem corrige o problema?
Nathan Fig
1
Você pode ter visualizações que não existem nos dois arquivos - esse é o objetivo de ter layouts -land e -port separados. No entanto, verifique os IDs - eu tinha o ID ausente no meu arquivo de retrato e estava recebendo esse erro ao alternar.
Maxpolun
4

Se você está adicionando Fragmentestaticamente, ou seja, em xml, pode ter perdido a implementação OnFragmentInteractionListenerem sua Activityclasse. Em seguida, a implementação da interface resolveria o problema. Se você estiver adicionando Fragmentdinamicamente, ou seja, na classe java, essa não é a solução. Como o próprio IDE não permitirá que você continue sem implementar as interfaces necessárias.

Shaheer Palollathil
fonte
3

Meu problema nesse caso foi uma instância simples de ter uma exceção de ponteiro nulo idiota em um dos meus métodos que estava sendo chamado mais tarde no ciclo de vida. Isso estava causando a exceção "Erro ao inflar fragmento de classe" para mim. Resumindo, lembre-se de verificar mais adiante o rastreamento da pilha de exceções para uma possível causa.

Depois que eu resolvi a exceção do ponteiro nulo, meu fragmento carregou bem.

ímpar
fonte
3

Nenhuma das soluções mencionadas acima me ajudou. No log, pude encontrar os detalhes da exceção, conforme mencionado abaixo:

06-19 16:20:37.885: E/AndroidRuntime(23973): Caused by: java.lang.RuntimeException: API key not found.  Check that /meta-data/ android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/ is in the application element of AndroidManifest.xml.

Eu fiz isso e meu código estava funcionando!

<meta-data  android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCl1yGPZ3mpxxxxxxxAz2R-t7zcWVzrHUL9k"/>
</application>
Khushboo
fonte
3

Se você não quiser alterar nada e usar a tag " fragment "

faça isso,

<fragment
 android:visibility="gone" (Visibility will not work, just helps in removing frag from xml viewer)(If you want the visibility to be gone make it in your fragment root element visibility=gone)
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:name="com.example.YOUR_FRAGMENT" (This is important)
 />
Sahaj Rana
fonte
2

Tinha o mesmo tipo de erro, onde exatamente a mesma mensagem de erro no logcat era exibida. Eu precisava fazer alterações no Java Build Path localizado em Project->Properties. Eu incluí bibliotecas relacionadas ao Google Maps como android-support-v4.jare google-play-services.jar; no entanto eu estava perdendo incluindo estes no 'Build class path'no 'Order and Export'menu de opções. Talvez o erro esteja aqui.

Tente incluir bibliotecas no caminho da classe de construção.

A ordem em que as classes são construídas também pode disparar o erro, portanto, meu conselho é também tentar reorganizar a ordem do caminho da construção. O erro desapareceu quando eu usei a seguinte ordem: 'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'. A última unidade contém os arquivos jar mencionados anteriormente.

Christian Bøge-Rasmussen
fonte
1

No seu arquivo xml, basta usar um em vez da tag. O inflator tenta criar um android.app.Fragment a partir do qual falhará na API <10. Portanto, você precisa criar um grupo de visualizações de um tipo diferente.

Lucas de Vil
fonte
1

certifique-se de que você tenha usado este

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyBEwmfL0GaZmdVqdTxxxxxxxx-rVgvY" />

isso não..

<meta-data 
         android:name="com.google.android.gms.version" 
          android:value="AIzaSyBEwmfL0GaZmdVqdTCvxxxxxxx-rVgvY" /> 
DjP
fonte
1

Só tive esse mesmo erro. A razão para a minha foi a visibilidade da minha classe de fragmento. Foi definido como padrão, deve ser público.

Southerton
fonte
1

Você poderia postar os fragmentos onCreatee onCreateViewmétodos? Eu tinha exatamente a mesma exceção que foi causada por uma exceção no onCreatemétodo fragment , quando corrigi esse problema, ele corrigiu o fragmento de classe inflado por erro.

AdamVe
fonte
1

Eu estava recebendo esse erro no android studio, o problema era que meu fragmento tinha um layout relativo enquanto o código na função OnCreateView era

mDrawerListView = (ListView) inflater.inflate(
                R.layout.fragment_navigation_drawer, container, false);

seu código está fazendo a mesma coisa?

Ahmad Moussa
fonte
1

Se você deseja herdar o AppCompatActivity , pode fazer algo assim: no xml da atividade, use um FrameLayout como este:

<FrameLayout
    android:id="@+id/result_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/progress_frame"/>

e na atividade onCreate-

final FragmentManager supportFragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = supportFragmentManager.beginTransaction();
    ft.replace(R.id.result_fragment, fphResultActivityFragment, "result fragment");
    ft.commitAllowingStateLoss();
Vaibhav Sharma
fonte
Graças isso ajudou. Não sei por que consegui usar o <fragment> no meu layout com sucesso em outros aplicativos em que trabalhei, mas não estava funcionando aqui!
SingularityFuture
apenas note que este trabalho pode, mas isso é geralmente para fragmentos dinâmicas e não estáticas
Tanner Summers
1

Eu recebi o mesmo erro, mas meu problema era que meu fragmento não tinha um ID no layout xml da atividade pai.

stevethecollier
fonte
1

Depois de um dia de luta, encontrei alguma verificação de cenário: você está enfrentando o mesmo,

Se tudo estiver funcionando como o código do Google, verifique o arquivo de manifesto. No meu caso, adicionei a chave geográfica e a chave de mapa, por isso ocorre a exceção,

Nota - não adicione duas chaves no arquivo de manifesto remova a chave do mapa

meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key"/>

código acima e adicione esse código.

 <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/auto_location"/>

 <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>
Yogesh Rathi
fonte
1

Eu tive um problema parecido; depois de executar o exemplo da AdMob , tentei inserir anúncios no meu aplicativo, causando este erro:

01-02 16:48:51.269    8199-8199/it.dndc.BreathPlot E/AndroidRuntime FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
 Caused by: android.view.InflateException: Binary XML file line #57: Error inflating class fragment

A solução é: você não pode inserir o fragmento de um anúncio em uma ListActivity. Em vez disso, eu poderia adicioná-lo a um FragmentActivity e a um ActionBarActivity sem nenhum problema.

Minha sugestão é: comece pelo exemplo da AdMob e adicione seu aplicativo existente: eu economizaria muito tempo !!!

user2270629
fonte
1

Se você usar ofuscação com o componente Navegação, precisará excluir o fragmento do android e seus argumentos. Inclua estas linhas nos arquivos de regras do programa:

# Exclude the fragments and argType for navigation component.
-keep class * extends androidx.fragment.app.Fragment{}
-keep class com.safetonet.presentation.features.parent.adddevice.model.PresentableAddDeviceData
user3193413
fonte