Estou usando Data Binding em meu projeto, ao usar <layout>
e <data>
em minha classe de vinculação xml não é gerada.
Por exemplo, eu tenho activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data> </data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
</layout>
Agora, se estou escrevendo ActivityMainBinding
na minha atividade / fragmento, mostra um erro que a classe não está disponível. Mas depois de incluir <variable>
no meu arquivo xml, ele é capaz de gerar ActivityMainBinding
classe.
Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
dataBinding.enabled
em seu build.gradle?ActivityMainBinding
-lo, ou ele tem que fazer algo com este bug.<variable>
em xml<variable>
, ele gera classe de ligação sem construir projeto.Respostas:
Não obtive respostas satisfatórias. Portanto, aqui estão as dicas que são um resumo do meu conhecimento de vinculação de dados.
Dicas para resolver problemas de DataBinding
Atualizar
Para obter erros e sugestões mais precisos , recomendo fortemente atualizar o Android Studio e a versão do plugin do Gradle para a versão mais recente. Porque não estou enfrentando muitos problemas após a versão AS 3.2.
Consulte o mais recente Android Studio e o mais recente plug-in do Gradle .
Solução Orignal
Verifique esses pontos um por um. Qualquer um deles pode fazer seu trabalho. O ponto 3 ao final é muito importante, por isso não os perca.
1. Verifique se a vinculação de dados está ativada
Você deve ter a vinculação de dados ativada em
build.gradle
. Se não, adicione isso e sincronize .2. Verifique se o layout é convertido em layout de ligação
Agora, se você deseja que a classe de ligação de dados seja gerada, você deve envolver
xml layout
com a ligação de dados (<layout
tag). Algo assim.Junto com isso, verifique se os nomes das variáveis de ligação estão corretos como na classe do modelo de visualização
3. Nome da classe de vinculação gerado automaticamente?
Sua classe de ligação de dados deve ser gerada após a criação do layout de ligação.
4. Não consegue ver a sugestão de importação?
Às vezes, ao digitar
ActivityMai...
, não há sugestão , nesse caso importe manualmente .5. Leia Build Fail Logcat
Sua classe de ligação e novas variáveis no layout não serão geradas se sua construção falhar. Portanto, primeiro faça o projeto com Ctrl + F9 (Build> Make project) .
6. Feche e abra o projeto do recente
Sempre faço isso porque leva muito menos tempo do que
Rebuild
/Make
project.Observe que eu prefiro Fechar e Abrir do Recente porque leva muito menos tempo do que Reconstruir / Reiniciar IDE .
7. Projeto de reconstrução
Se ainda assim sua classe não é gerada. (Algum tempo quando colamos o arquivo de layout, então acontece). Em seguida, reconstruir projeto de
Build> Rebuild
( não construir ou criar projeto ). Ele irá gerar sua classe de vinculação de dados. ( Rebuild faz mágica para mim. )8. Tenha o Android Studio mais recente
Depois de atualizar o AS para o Android Studio 3.2 , senti muitos bugs serem corrigidos na geração automática de vinculação de dados. Portanto, você também deve ter o AS mais recente.
Solução para
<variables
Normalmente, quando colocamos uma variável no layout, ele cria um getter e um setter dela. E podemos usar
binding.setItem(item);
ebinding.getItem();
, mas se você não conseguir ver esses métodos, leia as informações abaixo.1. Feche e abra o projeto do recente
Se você criou uma variável de dados -
<variable
em seu layout e ela não mostra seu setter e getter na classe de vinculação de dados, feche e abra do recente seu projeto.2. Limpe o projeto após mudar o tipo
Se você alterou o tipo de algum
<variable
em seu layout e o tipo de setter getter não muda, então Clean project (Build> Clean Project
)Palavras finais
Finalmente, se ainda assim sua classe de ligação não for gerada, temos nossa arma mais poderosa. - Reinicie o Android Studio: D
Isso é tudo que eu faço para resolver meus erros de vinculação de dados. Se você tiver mais problemas, pode comentar aqui.
fonte
Classe DataBinding gerada automaticamente.
se o seu nome xml for activity_test, a classe Binding será ActivityTestBinding.
mas,
layout deve ter layout como raiz
fonte
ConstraintLayout
como uma raiz. Obrigado!Eu tive o mesmo problema. Depois de ler os documentos SDK do Android, há apenas o nome do arquivo esperado a ser criado, mas nada sobre o que fazer se isso não acontecer. Percebi depois de mais algumas pesquisas que depois de remover o namespace para o elemento de layout como abaixo (usando seu exemplo), funcionou para mim.
fonte
No meu caso, a classe Binding foi gerada e instalada (mas pensei que não) ... mas não adiciona automaticamente a importação da referida classe à seção de importação de atividade / fragmento ... então ... OPÇÃO + ENTRAR :)
fonte
Depois de configurá-lo corretamente (incluindo o namespace xml e envolver tudo
<layout>
), o que funcionou para mim foi fazer Build -> Make project. Nem o Clean Project ou o Rebuild Project fizeram. Estou no Android Studio 2.3.1, usando as ferramentas de compilação 26.0.2. Não há necessidade de<data>
tags.fonte
se você faz o trabalho básico, para habilitar databainding em seu projeto, como use enable no gradle e use tag de layout em xml , quando você altera o código xml e não gera uma nova classe de databinding para aqueles xml, você pode usar uma maneira rápida para gerar apenas dados binding class in gradle-> other-> databindinggenbaseclassesDebug it fast more than bulid project inteiro. é gerar apenas classe de ligação de dados.
fonte
Para ativar o novo compilador de vinculação de dados, adicione a seguinte opção ao seu arquivo gradle.properties:
fonte
As classes de vinculação de dados são geradas durante a construção, portanto, depois de habilitar a vinculação de dados na construção do Gradle do aplicativo e envolver seu xml com a tag de layout, você deve reconstruir seu aplicativo. Se isso não ajudar, exclua sua pasta de construção e faça novamente.
fonte
Graças a esta resposta aqui - parece que o "namespace de layout" precisa ser eliminado ou você precisa de um novo nome exclusivo.
Aqui estão as opções que funcionaram para mim:
Crie um novo nome para o layout para garantir que ele possa ser gerado. Isso resolveu meu problema, onde eu tinha um layout que foi criado primeiro, sem vinculação de dados - vamos chamá-lo
fragment_abc.xml
. Quando tentei adicionar vinculação de dados a ele, não foi reconhecido - mesmo após várias chamadas de cache e reinicialização de limpeza. No entanto, assim que fiz uma cópia do layoutfragment_abc2.xml
, obtive imediatamente o objeto .java / .class de vinculação de dados gerado.Depois de ver o trabalho acima, tentei apenas remover a pasta / build do módulo e reconstruir o projeto - isso funcionou para obter a vinculação de dados para o layout original.
fonte
A única coisa que posso imaginar, se possível, é se você não tiver
em seu arquivo Gradle. Caso contrário, basta adicioná-lo ao arquivo gradle. ie
em seguida, sincronize seu projeto. Se ainda falhar, pode ser necessário fazer Invalidate / Restart do seu Android Studio
fonte
<variable>
em xml ele está gerando classe Binding, então não há caso de não adicionardataBinding
no arquivo gradle, se eu não tiver adicionado, não deve gerar classe de ligação.Eu não sei se vai funcionar para você ou não. Basta renomear o nome do arquivo XML do layout. Suponha que o nome do layout seja activity_main.xml, apenas altere-o para qualquer coisa como main.xml e renomeie-o para activity_main.xml . Então, você pode ver a opção de importação em ActivityMainBinding .
Espero que funcione para você.
fonte
Ao trabalhar com um aplicativo Android multimodule, verifique o caminho da classe de ligação. Talvez você deva usar:
import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding
em vez de:import com.yourcompany.app.android.databinding.FragmentABCtBinding
fonte
Exclua layouts e desfaça, e certifique-se de que as classes de ligação geradas sejam importadas corretamente depois disso.
fonte
Eu tive o mesmo problema. Tudo que você fez correto. A coisa é que você precisa adicionar a variável dentro da tag de dados em xml. Para isso, você deve criar uma classe de modelo de amostra e adicioná-la como variável na tag de dados.
Até que você não verá ActivityMainBinding gerado.
fonte
Tive um problema semelhante em que envolvi o layout e a vinculação de dados ativada no arquivo gradle. A atividade principal ainda não conseguia intelectualizar ou ver minhas aulas. O que consertou para mim foi adicionar a variável de ligação e importar a ligação de qualquer maneira. A partir daí, acabei de construir a solução e então parecia saber qual era a classe. De lá, pude importar minhas classes de caixa de camelo que foram geradas.
fonte
Eu entendi o problema e o problema estava no layout, o campo usado não era uma String, era uma Data.
Parece que todo campo tem que ser texto para funcionar, pelo menos com o componente TexView.
Se você construir com o comando ./gradlew build --stacktrace
Isso mostra melhor os erros.
fonte
No meu caso, pensei que a classe gerada deveria aparecer com minhas classes usuais na
src
pasta. Além disso, achei que o nome da classe gerada deveria ser um pouco diferente. Foi tudo erro meu. A classe gerada pode ser encontrada embuild
pasta,build -> generated -> ...
caminho. Se não houver importação da classe gerada em sua atividade, adicione a importaçãofonte
Caso você obtenha o seguinte erro em DataBindingUtil.setContentView
tudo que você precisa fazer é remover a seguinte instrução de importação
Encontrei a solução em outro fórum. Fonte
fonte
Se recentemente algum projeto existente migrou para o androidx , você precisa substituir sua importação de
para
Depois de 2 dias do Google finalmente consegui solução, qual funcionou para mim.
fonte
your.project.package.BR
). Não dentro de uma biblioteca de terceiros, comoandroidx.databinding.library.baseAdapters.BR
.Há casos em que você não verá um arquivo no diretório gerado, você pode estar vinculando uma propriedade que não está declarada no viewmodel. Essencialmente, não dá um erro de lint se você fizer isso em xml.
fonte
Se você está implementando o Serializable -> você deve implementar o Serializable
caso contrário, você obterá este erro. Espero que ajude alguém no futuro
No meu caso, uso a biblioteca Parcel. Perdi anotar @Parcel na minha subclasse
fonte
Além das etapas acima, você também pode verificar o tipo de variável. Certifique-se de que é String para TextView ou o mesmo definido no
BindingAdapter
. Por exemplo:e em XML:
Isso causará o erro acima. Para corrigir, você pode criar a variável de idade do tipo String ou importar String em seu XML e usar da
String.valueOf(age)
seguinte maneira:E em seu TextView:
fonte
Minha solução foi usar como sufixo FragmentBinding no nome da classe.
A nomenclatura do nome da atividade ou classe de fragmento pode variar em termos de prefixos. Porque o sufixo é sempre Vinculativo.
Depois de seguir a resposta de Khemraj e Invalidate Caches / Restart , você deve reescrever ActivityBinding ou FragmentBinding para obter as sugestões do IDE das classes que já foram geradas e NÃO codificar a importação.
No meu caso, estava tentando importar o nome da classe de trás para frente em
FragmentCompetitionsBinding
vez deCompetitionsFragmentBinding
.GL
Fonte
fonte
No meu caso, as classes de vinculação de dados não foram geradas porque eu excluí o mipmap Android Resource Directory. Recriei o diretório res / mipmap / e as classes de ligação de dados foram restabelecidas.
fonte
Eu encontrei um problema semelhante em que DataBinding falhou ao gerar a classe BindingImpl . No meu caso, foi um problema de um método na classe de dados onde o nome foi usado incorretamente: O modelo continha um método onSignInCliked () e no layout eu usei onSigninCliked () . Observe o SignIn vs Signin .
A mensagem de erro não foi suficiente e eu descobri o problema apenas quando usei o script de construção com a opção de rastreamento de pilha.
fonte
Certifique-se de que a vinculação de dados esteja ativada
dan clique no botão (Sincronizar projeto com Gradle)
fonte
Se houver um problema com seu arquivo XML, a classe Databinding não será gerada. Uma solução rápida seria percorrer o arquivo XML e verificar se há erros de sintaxe (geralmente destacados em vermelho). Os erros podem vir na forma de referências inexistentes ou erradas, erros tipográficos, etc.
Basicamente, certifique-se de que não haja nenhuma linha sublinhada em vermelho em seu código XML. Quando terminar, reconstrua e sua classe Databinding terá sido gerada.
fonte
1. Adicione abaixo no app gradle
2. No layout xml, escreva abaixo do código
fonte
use o caminho da classe 'com.android.databinding: dataBinder: 1.0-rc0'
fonte