我如何为 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)
}