我正在使用
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 字段
直到几天前还运行良好 我尝试过的:
删除
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 : "");
}
它可能会使用数据绑定代码循环自身,从而导致大量滞后
在 XML 中添加 inputType="textPhonetic" 解决了我的问题:
android:inputType="textPhonetic"
不确定哪种输入类型会导致此延迟。浪费了我一天的时间!
我刚刚和 Ildar Ishalin 有同样的情况。
我是这样解决的:
@BindingAdapter("android:text")
@JvmStatic
fun setText(target: TextView, text: String?) {
if (!target.text.contentEquals(text)) {
target.text = text
}
}