J'essaie de suivre l'exemple de liaison de données du document officiel google https://developer.android.com/tools/data-binding/guide.html
sauf que j'essaye d'appliquer la soumission de données à un fragment, pas à une activité.
l'erreur que j'obtiens actuellement lors de la compilation est
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
pour fragment ressemble à ceci:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
onCreateView
pour fragment ressemble à ceci:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
et certaines parties de mon fichier de mise en page pour fragment ressemblent à ceci:
<?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>
mon soupçon est que MartianDataBinding
ne sait pas avec quel fichier de mise en page il est censé être lié - d'où l'erreur. Aucune suggestion?
la source
View view = binding.getRoot();
Je suis coincé là-dessus depuis si longtemps que je suis légitimement assez contrarié de ne pas trouver de documentation à ce sujet sur developer.android.com ... Résolution du problème. Je vous remercie!Vous êtes en fait encouragé à utiliser la
inflate
méthode de votre liaison générée et non le DataBindingUtil:Docs pour DataBindingUtil.inflate () :
la source
cannot be resolved to a type
erreur de construction. Ce n'est pas fiable à mon avis. Si je vais d'abord avecDataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);
et que je le change ensuiteFragmentCameraBinding.inflate(inflater, container, false);
, cela fonctionne, mais après la reconstruction, cela donne à nouveau l'erreur.DataBindingUtil.inflate
MainFragmentBinding
classe. Cette classe est générée à partir du fichier de mise en page afin que la mise en page souhaitée soit automatiquement appliquée.Même les autres réponses peuvent bien fonctionner, mais je veux dire la meilleure approche.
Utilisez
Binding class's inflate
comme recommandé dans la documentation Android .Une option consiste à gonfler
DataBindingUtil
mais lorsque vous ne savez pas avoir généré la classe de liaison .- Vous avez généré automatiquement
binding class
, utilisez cette classe au lieu d'utiliserDataBindingUtil
.En Java
À Kotlin
Dans la documentation de la classe DataBindingUtil , vous pouvez voir.
Si votre classe de mise en page n'est pas générée @Voir cette réponse .
la source
inflate
méthode qui prend leLayoutInflater
comme seul argument?ViewGroup container
?container
nécessaire quandattachToRoot
c'esttrue
.Si vous utilisez ViewModel et LiveData C'est la syntaxe suffisante
Syntaxe de Kotlin:
la source
Essayez ceci dans Android DataBinding
la source
On peut simplement récupérer l'objet de vue comme mentionné ci-dessous
la source
Syntaxe de Kotlin:
la source
Tout comme la plupart l'ont dit, mais n'oubliez pas de définir LifeCycleOwner
Sample en Java ie
la source
travaillant dans mon code.
la source
Un exemple complet de fragments de liaison de données
FragmentMyProgramsBinding est une classe de liaison générée pour res / layout / fragment_my_programs
la source
Blog très utile sur la liaison de données: https://link.medium.com/HQY2VizKO1
Déclarez la valeur de liaison comme ceci dans Fragment:
N'oubliez pas d'écrire ceci en fragment
la source
Un autre exemple à Kotlin:
Notez que le nom "MartianDataBinding" dépend du nom du fichier de mise en page. Si le fichier est nommé "martian_data" alors le nom correct serait MartianDataBinding.
la source
Tout le monde en parle
inflate()
, mais que faire si nous voulons l'utiliseronViewCreated()
?Vous pouvez utiliser la
bind(view)
méthode de la classe de liaison concrète pour obtenir l'ViewDataBinding
instance duview
.Habituellement, nous écrivons BaseFragment quelque chose comme ceci (simplifié):
Et utilisez-le dans un fragment enfant.
Si tous les fragments utilisent la liaison de données, vous pouvez même la simplifier en utilisant le paramètre de type.
Je ne sais pas qu'il est correct d'affirmer une valeur non nulle ici, mais ... vous voyez l'idée. Si vous voulez qu'il soit nullable, vous pouvez le faire.
la source