我使用带有数据绑定的TextInputEditText - 直到最近它一直运行正常。这是其中一个出现问题的布局:
如果我删除
几天前还可以正常工作, 我尝试过的解决方法:
<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字段。几天前还可以正常工作, 我尝试过的解决方法:
removing
android:imeOptions="actionDone"
removing
android:inputType="textPassword"
removed each of the below from the view layer:
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; });