我的布局中有一堆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>
当用户尝试提交表单时,我有一个验证方法,可以检查每个字段并在无效字段上设置错误,如下所示:
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是错误的吗?这是一个已知的错误吗?有解决方法吗?
onKey 在将硬件密钥调度到视图时被调用。这 允许侦听器有机会在目标视图之前做出响应。
软件键盘中的按键通常不会触发此操作 方法,尽管在某些情况下有些人可能会选择这样做。不要 假设软件输入法必须基于键;就算是,它 可能会以与您预期不同的方式使用按键,因此没有 可靠地捕获软输入按键的方法。
如果侦听器已使用事件,则返回 True,否则返回 false。
当您从setOnKeyListener
中的方法返回true
时onKey
您已经使用了该事件,并且如果您希望视图以默认方式对按键做出反应,则不会将事件发送到视图,则始终从视图中返回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官方文档所述:
硬件密钥时要调用的回调的接口定义 事件被调度到此视图。回调将在之前调用 关键事件被赋予视图。这仅对硬件有用 键盘;软件输入法没有义务触发此 听者。