首页 > 解决方案 > 如何防止禁用的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 获得焦点。

标签: androidandroid-edittextandroid-databindingfocusable

解决方案


首先利用:

<com.google.android.material.textfield.TextInputEditText/> 

代替:

<androidx.appcompat.widget.AppCompatEditText/>

对于这个问题:当输入有效的用户名但edittext不可聚焦时,密码editext被启用。

启用后用于editText.requestFocus()使 edittext 聚焦。还可以考虑使用TextWatcherfor edittext 来简化验证目的。


推荐阅读