0

我的布局中有一堆TextInputEditText,定义如下:

<android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

   <android.support.design.widget.TextInputEditText
                android:id="@+id/confirmPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/registration_confirm_password"
                android:inputType="textPassword" />

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

当用户尝试提交表单时,我有一个 validate 方法来检查每个字段并在无效字段上设置错误,如下所示:

if(confirmPassword.text.toString() != password.text.toString()) {
        confirmPassword.error = "Passwords don't match"
        confirmPassword.setOnKeyListener { _, _, _ ->
            confirmPassword.error = null
            true
        }
        valid = false
}

一旦用户开始纠正他的错误,OnKeyListener 就会在那里消除错误。

此代码在我的模拟器和装有 Android 5.1.1 的设备上完美运行。但是在我的一位用户的设备上,一台装有 Android 6.0 的三星 Galaxy S6 Edge,当他犯了一个错误并且某个字段上有错误时,他就无法再编辑它了。

我使用 TextInputEditText 错了吗?这是一个已知的错误吗?有解决方法吗?

4

1 回答 1

5

onKey 在将硬件键分派到视图时调用。这允许侦听器有机会在目标视图之前做出响应。

软件键盘中的按键通常不会触发此方法,尽管在某些情况下可能会选择这样做。不要假设软件输入法必须是基于键的;即使是这样,它也可能以与您预期不同的方式使用按键,因此无法可靠地捕捉软输入按键。

如果侦听器已经消费了事件,则返回 True,否则返回 false。

当您trueonKey方法中返回时,您已经消耗了事件,并且如果您希望视图以默认方式对按键做出反应setOnKeyListener,事件将不会被发送到视图总是从它返回false

但是对您来说更好的解决方案是使用您的代码更好地支持软键盘按键addTextChangedListener而不是这种方式:setOnKeyListener

if(confirmPassword.text.toString() != password.text.toString()) {
            confirmPassword.error = "Passwords don't match"
            confirmPassword.addTextChangedListener (new TextWatcher {
                afterTextChanged(Editable s) { 
                    // Nothing to do here 
                }

                beforeTextChanged(CharSequence s, int start, int count, int after) { 
                   // Nothing to do here 
                }

                onTextChanged(CharSequence s, int start, int before, int count) {
                    // When user start to edit, delete the error feedback 
                    confirmPassword.error = null
                }
            });

    valid = false;          
}

正如View.OnKeyListener 官方文档所述:

将硬件按键事件分派到此视图时要调用的回调的接口定义。将在将键事件提供给视图之前调用回调。这仅对硬件键盘有用;软件输入法没有义务触发这个监听器。

于 2018-03-25T21:41:03.453 回答