EditText TextWatcher 替换为 LiveData

EditText TextWatcher replace with LiveData

有没有办法用双向数据绑定模式替换 EditText TextWatcher

我试过了:

class AddViewModel @Inject constructor() : ViewModel() {
    val description = MutableLiveData<String>()
}
<com.google.android.material.textfield.TextInputEditText
    android:id="@+id/descriptionEditText"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginTop="4dp"
    android:layout_marginBottom="@dimen/default_spacing"
    android:background="@drawable/ic_input_background"
    android:gravity="top"
    android:minHeight="200dp"
    android:padding="4dp"
    android:text="@{viewModel.description}"
    app:layout_constraintBottom_toTopOf="@+id/postButton"
    app:layout_constraintEnd_toEndOf="parent"/>

我找到了类似的东西 here,但不知何故我无法让它工作。

更新:

我只是在 @

之后缺少 = 签名

android:text="@{viewModel.description}" -> android:text="@={viewModel.description}"

您应该在 XML

中使用 OnTextChanged 属性
 <data>

    <variable
        name="onTextChanged"
        type="androidx.databinding.adapters.TextViewBindingAdapter.OnTextChanged" />
 </data>
 <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/descriptionEditText"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginTop="4dp"
            android:layout_marginBottom="@dimen/default_spacing"
            android:background="@drawable/ic_input_background"
            android:gravity="top"
            android:minHeight="200dp"
            android:padding="4dp"
            android:onTextChanged="@{viewModel.description}"
            app:layout_constraintBottom_toTopOf="@+id/postButton"
            app:layout_constraintEnd_toEndOf="parent"/>

现在您可以将 onTextChanged 传递给包含的布局,如下所示。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <include
        layout="@layout/base_edittext_view"
        app:onTextChanged="@{(text, start, before, count) -> viewModel.onTextChanged(text)}"/>

</LinearLayout>

然后你需要在你的ViewModel中添加这个方法

fun description(s: CharSequence,start: Int,before : Int,count :Int){
    //TODO write your implementation here ...
   }