android - 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 && !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
直到几天前它都工作得很好我尝试过什么:
去除
android:imeOptions="actionDone"
去除
android:inputType="textPassword"
从视图层中删除了以下各项:
binding.newPassConfirm.setOnClickListener(v -> binding.newPassConfirm.setError(null)); binding.newPassConfirmEt.addTextChangedListener(new DefaultTextWatcher() { @Override public void afterTextChanged(Editable s) { binding.newPassConfirm.setError(null); } }); binding.newPassConfirmEt.setOnEditorActionListener( (v, actionId, event) -> { if (actionId == EditorInfo.IME_ACTION_DONE || event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { mViewModel.onOkClick(); return true; } return false; });
解决方案
错误的原因是 DataBindingAdapter 中的这个方法
@BindingAdapter("android:text")
public static void setText(TextView textView, String text) {
textView.setText(text != null ? text : "");
}
它可能会使用数据绑定代码自行循环,从而导致大量滞后
推荐阅读
- java - 具有空字段的 Java 比较器
- c++ - 模板类中的析构函数给出错误
- c# - 在 autofac c# 中首次调用对象时动态实例化对象
- android - 单击 RecyclerView 后更新主要活动中的 TextView
- bash - bash中opts=${1:+--host $1}是什么意思?
- php - Zend Framework - 如何告诉漂亮的 url 去静态 url?
- ios - 如何减少 base64 字符串长度
- graalvm - 是否可以在 Java“GraalVM”程序中运行 Python 程序?
- ios - draw(_ rect: CGRect) 不绘制超过一定尺寸
- python - 在 python 代码中使用环境变量(从 shell/终端传递)的正确方法