TextInputEditText在使用数据绑定时输入会卡住

4
我使用带有数据绑定的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 &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字段。
几天前还可以正常工作, 我尝试过的解决方法:
  • 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;
                    });
    

我在Jetpack Compose TextField中遇到了相同的问题,这是在Android 9版本中发生的。如何在Compose中解决这个问题?#jetpack-compose - SabetiG
3个回答

0

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

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

使用数据绑定代码可能会使其循环自身,导致严重的卡顿问题。


0
在XML中添加inputType="textPhonetic"解决了我的问题:
android:inputType="textPhonetic"

不确定是哪种输入类型导致了这个延迟。浪费了我一整天的时间!


你知道在Jetpack Compose中如何解决这个问题吗? - SabetiG

0
我刚刚遇到了和Ildar Ishalin一样的情况。
我是这样解决的:
@BindingAdapter("android:text")
@JvmStatic
fun setText(target: TextView, text: String?) {
    if (!target.text.contentEquals(text)) {
        target.text = text
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接