Directorio de artículos
I. Introducción
DataBinding
Es JetPack
una biblioteca para el enlace bidireccional, que puede desacoplar los datos y la interfaz de usuario. Aquí hay un registro simple de su uso.
2. Configuración del entorno
También es necesario agregar complementos y bibliotecas dependientes para usar en la versión anterior anterior DataBinding
, pero por ahora, no necesita ser tan complicado, solo build.gradle
una configuración simple en . Hay dos métodos de configuración, como sigue:
método uno:
android {
...
dataBinding {
enabled = true
}
}
Método dos:
android {
...
buildFeatures {
dataBinding = true
//viewBinding = true
}
}
3. Convierta un diseño existente en un diseño de enlace de datos
Si queremos usar el enlace de datos, el diseño debe usar el siguiente formato:
<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>
Puede ver que hay más etiquetas que el diseño anterior . La etiqueta interior se <data></data>
puede omitir si la operación de asignación no se utiliza en la práctica. Si cambiamos manualmente a este diseño, será un poco más problemático. El oficial proporciona una manera simple.
Primero, debe usar el método anterior para habilitar la función de enlace de datos. Luego use la tecla de método abreviado en el diseño (MAC use Alt+Enter), la tecla de método abreviado se puede llamar en cualquier espacio en blanco antes de la línea 6
Después de seleccionar y confirmar, se convertirá en el siguiente código
<?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>
Cuarto, enlace de datos
Modifique el código anterior para el enlace de datos
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 = "啦啦啦"
}
}
Puede ver que el diseño genera una ActivityMainBinding
clase. Al modificar esta clase, change
puede modificar directamente el contenido de la interfaz de usuario.
Cinco, archivo de enlace de datos
JetPack tiene enlace de vista y enlace de datos. El enlace de vista guarda la findViewById()
operación, y el enlace de datos puede asignar datos directamente. Los archivos DataBinding se generan de las siguientes maneras
La primera forma:
private val binding: ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater)
}
Segunda forma:
val binding: ActivityMainBinding = DataBindingUtil.setContentView(
this, R.layout.activity_main)
Si está utilizando elementos vinculados a datos en o Fragment
en un adaptador. Se pueden utilizar las siguientes formas:ListView
RecycleView
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
A veces no sabemos el tipo de hormigón a unir. En este momento, puede usar los siguientes métodos para enlazar
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)
Si el diseño se aumenta utilizando otros mecanismos, se puede vincular por separado de la siguiente manera:
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
¿Cuándo se usará este método, como el uso de etiquetas <include>
, <ViewStub>
etc. en el diseño? O necesita agregar el diseño dinámicamente. se puede usar de esta manera
Variables dinámicas:
A veces, el sistema no conoce una clase de vinculación específica. Por ejemplo, ejecutar contra un diseño arbitrario RecyclerView.Adapter
no conoce la clase de enlace específica. El valor vinculante aún debe especificarse al llamar al onBindViewHolder()
método .
En el siguiente ejemplo, RecyclerView
todos los diseños están obligados a tener una variable de elemento. BindingHolder
Los objetos tienen un getBinding()
método que devuelve ViewDataBinding
la clase base.
override fun onBindViewHolder(holder: BindingHolder, position: Int) {
item: T = items.get(position)
holder.binding.setVariable(BR.item, item);
holder.binding.executePendingBindings();
}
Nota : la biblioteca de vinculación de datos genera una clase denominada BR en el paquete del módulo que contiene el ID del recurso utilizado para la vinculación de datos. En el ejemplo anterior, la biblioteca genera automáticamente la variable BR.item.
Para obtener esta explicación, consulte https://blog.csdn.net/cunchi4221/article/details/107478770
https://blog.csdn.net/mountain_eyes/article/details/80627037