android - 如何防止禁用的edittext获得焦点?
问题描述
场景:
带有用户名和密码编辑文本的注册页面。
仅当输入的用户名有效时才启用密码。
布局 XML:
<com.google.android.material.textfield.TextInputLayout
...>
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/username_edit_text"
android:inputType="text"
android:onTextChanged="@{model::onUsernameTextChanged}"
.../>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
...>
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/sign_in_fragment_password_edit_text"
android:enabled="@{safeUnbox(model.isUsernameValid)}"
android:focusable="@{safeUnbox(model.isUsernameValid)}"
android:inputType="textPassword"
android:onTextChanged="@{model::onPasswordTextChanged}"
.../>
</com.google.android.material.textfield.TextInputLayout>
查看型号:
var isUsernameValid: ObservableField<Boolean> = ObservableField(false)
// On username text changed
fun onUsernameTextChanged(usernameString: CharSequence, start: Int, before: Int, count: Int) {
// Update username validity
isUsernameValid.set(usernameString.length >= 8)
}
可观察字段在视图模型isUsernameValid
中更新。onUsernameTextChanged()
上面代码的问题:
输入有效用户名时启用密码editext,但edittext不可聚焦。
android:focusable="@{safeUnbox(model.isUsernameValid)}"
即使使用软键盘下一步操作没有输入有效的用户名,删除也会使 edittext 获得焦点。
解决方案
首先利用:
<com.google.android.material.textfield.TextInputEditText/>
代替:
<androidx.appcompat.widget.AppCompatEditText/>
对于这个问题:当输入有效的用户名但edittext不可聚焦时,密码editext被启用。
启用后用于editText.requestFocus()
使 edittext 聚焦。还可以考虑使用TextWatcher
for edittext 来简化验证目的。
推荐阅读
- java - Eclipse IDE 和 Spring Tools Suite 的 SQL 开发工具在哪里?为什么他们似乎在他们的市场上不可用?
- .net-core - 当我将 .Net Core 2.1 项目上传到 plesk 服务器时,找不到文件或目录
- ruby-on-rails - Ruby HABTM 关联循环
- r - 循环仅在 R 中的最后一次迭代中运行 - 循环参与者
- python - 如何通过列表解析这些操作?
- ios - IOS 通知权限警报不显示
- python - 使用 Python 在 html 中搜索字符串
- python - 如何使用 Python 访问嵌套字典中的字符串数据
- c# - 连接到 SQL Server 时如何在 C# 中解决(错误 40:无法打开到 SQL Server 的连接)
- php - 如果用户登录 Laravel,从 Wordpress 重定向到 Laravel?