Как передать текущий вид вызываемому методу модели представления? - PullRequest
0 голосов
/ 19 октября 2018

Мне нужно обрезать текст в моем 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 голосов
/ 22 октября 2018

Нельзя использовать ключевое слово this в привязке данных.Вместо этого вы можете установить значение name в методе afterNameChanged.

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

Но если вы сделаете это, пользователь не сможет ввести пробел в своем имени.потому что пробелы будут урезаны.

Вы также можете использовать двустороннюю привязку данных .Это обновит имя в модели, когда пользователь что-то введет.Вы можете обрезать имя в установщике имени.

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

Но проблема будет та же, пользователь не сможет ввести пробел.

Так что вам просто нужно обрезать имя при настройкеэто программно.

0 голосов
/ 20 октября 2018

Вы можете сделать это в рамках привязки данных Android.В вашем редактируемом тексте в xml, android:afterTextChanged="@{model::afterTextChanged}".А на ваш взгляд модель

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