更改文本后,我需要在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数据绑定框架中是否可能?
答案 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}"
但是将会出现同样的问题,用户将无法输入空间。
因此,当您以编程方式设置名称时,应该只修剪名称。