Estou tentando seguir o exemplo de ligação de dados do oficial google doc https://developer.android.com/tools/data-binding/guide.html
exceto que estou tentando aplicar a vinculação de dados a um fragmento, não a uma atividade.
o erro que estou recebendo ao compilar é
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
para fragmento é assim:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
onCreateView
para fragmento é assim:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
e partes do meu arquivo de layout para fragmento são assim:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="marsdata"
type="uk.co.darkruby.app.myapp.MarsDataProvider" />
</data>
...
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@{marsdata.martianSols}"
/>
</RelativeLayout>
</layout>
minha suspeita é que MartianDataBinding
não sabe a qual arquivo de layout ele deve estar vinculado - daí o erro. Alguma sugestão?
fonte
View view = binding.getRoot();
Estou preso há tanto tempo que estou legitimamente chateado por não encontrar nenhuma documentação sobre isso no developer.android.com ... Resolvido o problema. Obrigado!Você é incentivado a usar o
inflate
método da ligação gerada e não o DataBindingUtil:Documentos para DataBindingUtil.inflate () :
fonte
cannot be resolved to a type
erro na compilação. Não é confiável na minha opinião. Se eu for primeiroDataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);
e depois alterá-lo paraFragmentCameraBinding.inflate(inflater, container, false);
, ele funciona, mas após a reconstrução, ocorre o erro novamente.DataBindingUtil.inflate
MainFragmentBinding
classe. Essa classe é gerada a partir do arquivo de layout, para que o layout desejado seja aplicado automaticamente.Até as outras respostas podem funcionar bem, mas quero dizer a melhor abordagem.
Use
Binding class's inflate
como recomendado na documentação do Android .Uma opção é aumentar,
DataBindingUtil
mas quando apenas você não sabe, gerou uma classe de ligação .--Você gerou automaticamente
binding class
, use essa classe em vez de usarDataBindingUtil
.Em Java
Na cidade Kotlin
Na documentação da classe DataBindingUtil , você pode ver.
Se sua classe de bineamento de layout não for gerada @ Consulte esta resposta .
fonte
inflate
método que levaLayoutInflater
como argumento único?ViewGroup container
?container
é necessária quandoattachToRoot
étrue
.Se você estiver usando o ViewModel e o LiveData, esta é a sintaxe suficiente
Sintaxe de Kotlin:
fonte
Tente isso no Android DataBinding
fonte
Pode-se simplesmente recuperar o objeto de exibição como mencionado abaixo
fonte
Sintaxe de Kotlin:
fonte
Como a maioria já disse, mas não se esqueça de configurar o LifeCycleOwner
Sample em Java, ou seja,
fonte
trabalhando no meu código.
fonte
Um exemplo completo em Fragmentos de ligação de dados
FragmentMyProgramsBinding é uma classe de ligação gerada para res / layout / fragment_my_programs
fonte
Blog muito útil sobre ligação de dados: https://link.medium.com/HQY2VizKO1
Declare val de ligação como este no fragmento:
Não se esqueça de escrever isso em fragmento
fonte
Outro exemplo no Kotlin:
Observe que o nome "MartianDataBinding" depende do nome do arquivo de layout. Se o arquivo tiver o nome "martian_data", o nome correto será MartianDataBinding.
fonte
Todo mundo fala sobre
inflate()
, mas e se quisermos usá-loonViewCreated()
?Você pode usar o
bind(view)
método da classe de ligação concreta para obter umaViewDataBinding
instância para oview
.Normalmente, escrevemos BaseFragment algo como isto (simplificado):
E use-o no fragmento filho.
Se todos os fragmentos usarem ligação de dados, você poderá simplificá-lo usando o parâmetro type.
Não sei se é certo afirmar não nulo lá, mas ... você entendeu a idéia. Se você quiser que seja anulável, poderá fazê-lo.
fonte