首页 > 解决方案 > TextInputEditText 冻结输入与数据绑定

问题描述

我正在使用TextInputEditText-databinding直到最近它运行良好。这是出现此问题的布局之一:

            <android.support.design.widget.TextInputLayout
                android:id="@+id/new_pass_confirm"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:hint="@string/new_pass_confirm_hint"
                app:errorEnabled="true"
                app:passwordToggleEnabled="true">

                <android.support.design.widget.TextInputEditText
                    android:id="@+id/new_pass_confirm_et"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:enabled="@{viewmodel.enabled &amp;&amp; !viewmodel.progress}"
                    android:imeOptions="actionDone"
                    android:inputType="textPassword"
                    android:maxLines="1"
                    android:text="@={viewmodel.newPassConfirm}"
                    android:textSize="18sp" />

            </android.support.design.widget.TextInputLayout>

但是现在,每当用户尝试输入任何内容时,应用程序logcat都会冻结并一遍又一遍地充斥着重复的消息:

V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@ccaf106 nm : package.my ic=com.android.internal.widget.EditableInputConnection@87ca3c7
I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@e26ddb nm : package.my ic=com.android.internal.widget.EditableInputConnection@43b078
I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@4fff78e nm : package.my ic=com.android.internal.widget.EditableInputConnection@43ddbaf
I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
W/IInputConnectionWrapper: getCursorCapsMode on inactive InputConnection

如果我删除问题就会消失android:text="@={viewmodel.newPassConfirm}"看起来问题在于val newPassConfirm = ObservableField("")尝试在无限循环中更改 xml-field

直到几天前它都工作得很好我尝试过什么:

标签: androidandroid-databindingandroid-textinputedittext

解决方案


错误的原因是 DataBindingAdapter 中的这个方法

@BindingAdapter("android:text")
public static void setText(TextView textView, String text) {
    textView.setText(text != null ? text : "");
}

它可能会使用数据绑定代码自行循环,从而导致大量滞后


推荐阅读