我如何为 TextView 使用 DataBinding?
How can i use DataBinding for TextView?
我有一个问题,我不知道如何为 TextView 使用 DataBinding。我为 Glide 做了一个 DataBinding 并且它成功了,但是对于 TextView 我不知道该怎么做
这是代码
viewModel2.shouldShowImageProfile.observe(this) {
Glide.with(binding.root)
.load(it)
.circleCrop()
.into(binding.rivProfile)
}
viewModel2.shouldShowUsername.observe(this){
TextView.with(binding.root) <- the TextView
.load(it)
.into(binding.tvHello)
}
我写我的回答是基于 shouldShowUsername
的假设,但由于那是你的 String
值,你可以这样做:
viewModel2.shouldShowUsername.observe(this) { shouldShowUsername ->
binding.tvHello.isVisible = !shouldShowUsername.isNullOrEmpty()
binding.tvHello.text = shouldShowUsername
}
这将导致您的 TextView
仅在 shouldShowUsername
具有适当的值时显示,然后获取该值并将其分配给 TextView
。如果您希望 TextView
始终显示,您可以跳过块中的第一行。
如果您不想在 viewmodel 的变量上使用观察方法,您可以使用数据绑定并直接从 xml 更改 textview 的值,这样您就不必手动编写 binding.tvUserName.text = it.value。下面的代码显示了使用 xml 和视图模型进行数据绑定的示例。
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="viewModel"
type="com.example.kotlinbasics.android_architecture.mvvm_architecture.ChatViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light"
tools:context=".android_architecture.mvvm_architecture.UserOneFragment">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etMessageToSecond"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/_10sdp"
android:background="@drawable/text_field_background"
android:gravity="center"
android:hint="@string/enter_message"
android:padding="@dimen/_7sdp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent="0.7" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvCurrentMessage"
android:text="@{`Current Message: `+viewModel.latestMessageFromFirst}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_50sdp"
android:padding="@dimen/_10sdp"
android:textColor="@color/white"
android:textSize="@dimen/_20ssp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etMessageToSecond" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
在上面的示例中,我在 textview 中打印用户在 edittext 字段中写入的实时文本。每当用户在 edittext 中写入时,它的值都会在 viewmodel 中更新,而 textview 会在运行时访问该值。
对于图像,您可以像这样创建自定义绑定适配器来更新图像。示例:
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivEmailVerification"
loadImageFromUrl="@{viewModel.emailVerifyImageUrl}"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvIsEmailValid"
app:layout_constraintWidth_percent="0.7" />
和 BindingAdpater
@BindingAdapter("loadImageFromUrl")
fun ImageView.loadImageFromUrl(imageUrl: String) {
Picasso.get().load(imageUrl).into(this)
}
我有一个问题,我不知道如何为 TextView 使用 DataBinding。我为 Glide 做了一个 DataBinding 并且它成功了,但是对于 TextView 我不知道该怎么做
这是代码
viewModel2.shouldShowImageProfile.observe(this) {
Glide.with(binding.root)
.load(it)
.circleCrop()
.into(binding.rivProfile)
}
viewModel2.shouldShowUsername.observe(this){
TextView.with(binding.root) <- the TextView
.load(it)
.into(binding.tvHello)
}
我写我的回答是基于 shouldShowUsername
的假设,但由于那是你的 String
值,你可以这样做:
viewModel2.shouldShowUsername.observe(this) { shouldShowUsername ->
binding.tvHello.isVisible = !shouldShowUsername.isNullOrEmpty()
binding.tvHello.text = shouldShowUsername
}
这将导致您的 TextView
仅在 shouldShowUsername
具有适当的值时显示,然后获取该值并将其分配给 TextView
。如果您希望 TextView
始终显示,您可以跳过块中的第一行。
如果您不想在 viewmodel 的变量上使用观察方法,您可以使用数据绑定并直接从 xml 更改 textview 的值,这样您就不必手动编写 binding.tvUserName.text = it.value。下面的代码显示了使用 xml 和视图模型进行数据绑定的示例。
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="viewModel"
type="com.example.kotlinbasics.android_architecture.mvvm_architecture.ChatViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light"
tools:context=".android_architecture.mvvm_architecture.UserOneFragment">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etMessageToSecond"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/_10sdp"
android:background="@drawable/text_field_background"
android:gravity="center"
android:hint="@string/enter_message"
android:padding="@dimen/_7sdp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent="0.7" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvCurrentMessage"
android:text="@{`Current Message: `+viewModel.latestMessageFromFirst}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_50sdp"
android:padding="@dimen/_10sdp"
android:textColor="@color/white"
android:textSize="@dimen/_20ssp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etMessageToSecond" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
在上面的示例中,我在 textview 中打印用户在 edittext 字段中写入的实时文本。每当用户在 edittext 中写入时,它的值都会在 viewmodel 中更新,而 textview 会在运行时访问该值。
对于图像,您可以像这样创建自定义绑定适配器来更新图像。示例:
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivEmailVerification"
loadImageFromUrl="@{viewModel.emailVerifyImageUrl}"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvIsEmailValid"
app:layout_constraintWidth_percent="0.7" />
和 BindingAdpater
@BindingAdapter("loadImageFromUrl")
fun ImageView.loadImageFromUrl(imageUrl: String) {
Picasso.get().load(imageUrl).into(this)
}