Annuaire d'articles
Introduction
DataBinding
Il s'agit JetPack
d'une bibliothèque pour la liaison bidirectionnelle, qui peut découpler les données et l'interface utilisateur. Voici un simple enregistrement de son utilisation
2. Configuration de l'environnement
Il est également nécessaire d'ajouter des plug-ins et des bibliothèques dépendantes à utiliser sur l'ancienne version précédente DataBinding
, mais pour l'instant, cela n'a pas besoin d'être si compliqué, juste build.gradle
une configuration simple dans . Il existe deux méthodes de configuration, comme suit :
première méthode :
android {
...
dataBinding {
enabled = true
}
}
Deuxième méthode :
android {
...
buildFeatures {
dataBinding = true
//viewBinding = true
}
}
3. Convertir une mise en page existante en mise en page de liaison de données
Si nous voulons utiliser la liaison de données, la mise en page doit utiliser le format suivant :
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="com.myapp.data.ViewModel" />
</data>
<ConstraintLayout... /> <!-- UI layout's root element -->
</layout>
<layout></layout>
Vous pouvez voir qu'il y a plus d' étiquettes que la mise en page précédente . L'étiquette à l'intérieur peut <data></data>
être omise si l'opération d'affectation n'est pas utilisée en pratique. Si nous passons manuellement à cette disposition, ce sera un peu plus gênant. Le fonctionnaire fournit un moyen simple.
Tout d'abord, vous devez utiliser la méthode ci-dessus pour activer la fonction de liaison de données. Utilisez ensuite la touche de raccourci dans la mise en page (MAC utilisez Alt + Entrée), la touche de raccourci peut être appelée dans n'importe quel espace vide avant la ligne 6
Après avoir sélectionné et confirmé, il deviendra le code suivant
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/show_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="弹出一个对话框"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/update_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:layout_constraintTop_toBottomOf="@+id/show_dialog"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="value" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Quatrièmement, liaison de données
Modifier le code ci-dessus pour la liaison de données
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="change"
type="String" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/show_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="弹出一个对话框"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/update_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@{change}"
app:layout_constraintTop_toBottomOf="@+id/show_dialog"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="value" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
private val binding: ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.showDialog.setOnClickListener {
LoginDialog().show(supportFragmentManager,"")
}
binding.change = "啦啦啦"
}
}
Vous pouvez voir que la mise en page génère une ActivityMainBinding
classe. En modifiant cette classe, change
vous pouvez modifier directement le contenu de l'interface utilisateur.
Cinq, fichier DataBinding
JetPack a une liaison de vue et une liaison de données. La liaison de vue enregistre l' findViewById()
opération et la liaison de données peut affecter directement des données. Les fichiers DataBinding sont générés de la manière suivante
La première manière :
private val binding: ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater)
}
Deuxième manière :
val binding: ActivityMainBinding = DataBindingUtil.setContentView(
this, R.layout.activity_main)
Si vous utilisez des éléments liés aux données Fragment
dans ListView
ou dans un adaptateur. RecycleView
Les moyens suivants peuvent être utilisés :
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
Parfois, nous ne connaissons pas le type de béton à lier. À ce stade, vous pouvez utiliser les méthodes suivantes pour lier
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)
Si la mise en page est augmentée à l'aide d'autres mécanismes, elle peut être liée séparément comme suit :
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Quand cette méthode sera-t-elle utilisée, comme l'utilisation de balises <include>
, <ViewStub>
etc. dans la mise en page. Ou vous devez ajouter la mise en page dynamiquement. peut être utilisé de cette façon
Variables dynamiques :
parfois, le système ne connaît pas une classe de liaison spécifique. Par exemple, l'exécution sur une disposition arbitraire RecyclerView.Adapter
ne connaît pas la classe de liaison spécifique. La valeur de liaison doit toujours être spécifiée lors de l'appel de la onBindViewHolder()
méthode .
Dans l'exemple suivant, RecyclerView
toutes les mises en page sont liées à une variable d'élément. BindingHolder
Les objets ont une getBinding()
méthode qui renvoie ViewDataBinding
la classe de base.
override fun onBindViewHolder(holder: BindingHolder, position: Int) {
item: T = items.get(position)
holder.binding.setVariable(BR.item, item);
holder.binding.executePendingBindings();
}
Remarque : La bibliothèque de liaison de données génère une classe nommée BR dans le package du module qui contient l'ID de la ressource utilisée pour la liaison de données. Dans l'exemple ci-dessus, la bibliothèque génère automatiquement la variable BR.item.
Pour cette explication, veuillez vous référer à https://blog.csdn.net/cunchi4221/article/details/107478770
https://blog.csdn.net/mountain_eyes/article/details/80627037