如何将当前视图传递给视图模型的调用方法?

时间:2018-10-19 17:10:56

标签: android kotlin android-databinding

更改文本后,我需要在TextInputEditText中修剪文本。简而言之,我需要这样的东西:

<com.google.android.material.textfield.TextInputEditText
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:hint="@string/label_title"
    android:text="@{ model.name }"
    android:maxLength="256"
    android:maxLines="1"
    android:singleLine="true"
    android:afterTextChanged="@{(s) -> model::afterNameChanged(this, s)}"
    app:validateEmpty="@{true}"
    app:validateEmptyMessage="@{@plurals/error_too_short(1, 1)}"
    app:validateEmptyAutoDismiss="@{true}"/>

然后在我的视图模型中:

class TimetableEditorViewModel(app: Application) : AndroidViewModel(app) {

    var name = ObservableString("")

    fun afterNameChanged(view: TextInputEditText, s: Editable) {
        view.setText(s.trim())
    }
}

Android数据绑定框架中是否可能?

2 个答案:

答案 0 :(得分:1)

您可以在android数据绑定框架中实现此目的。在xml中的编辑文本中,android:afterTextChanged="@{model::afterTextChanged}"。 在您的视图模型中

    fun afterTextChanged(editable: Editable) {
    if (editable.isNotEmpty()) {
       //Set your name variable here.
        }
    }
}

答案 1 :(得分:1)

您不能在数据绑定中使用this关键字。相反,您可以在name方法中设置afterNameChanged的值。

fun afterNameChanged(view: TextInputEditText, s: Editable) {
    name.set(s.trim().toString())
}

但是,如果执行此操作,则用户将无法以他的名字输入空格。因为空格会被修剪。

您也可以使用two-way data binding。用户输入内容时,这将更新模型中的名称。您可以在名称设置器中修剪名称。

android:text="@={model.name}"

但是将会出现同样的问题,用户将无法输入空间。

因此,当您以编程方式设置名称时,应该只修剪名称。