【Android】如何优雅地解决EditText默认焦点问题

前言

若Activity中存在可焦点EditText,进入Activity时EditText会默认获得焦点并弹出软键盘,十分影响用户体验。而且,在onCreate(onCreateView)中调用EditText.clearFocus()没有任何作用。在API 26以后可以通过在布局文件中设置android:focusedByDefault="false"来取消默认焦点,但是最低支持API 26并不现实,只能寻求其他解决办法。

常用方法

在EditText的父布局中添加两个属性:

android:focusable="true"
android:focusableInTouchMode="true"

这样,默认焦点行为将被父布局截断,以达到取消EditText默认焦点的目的。

若只是想阻止默认软键盘的弹出,可在AndroidManifest.xml对应Activity中添加属性

android:windowSoftInputMode="stateHidden"

另辟蹊径

当以上方法无法使用时,还有没有什么办法解决问题呢?答案时肯定的。

1. 设置EditText不可焦点


 
android:focusable="false"

// 或者在onCreate中调用

mEditText.setFocusable(false);

2. 在onCreate中添加

mEditText.post(new Runnable() {
    @Override
    public void run() {
        mEditText.setFocusableInTouchMode(true);
    }
});

3. 由于mEditText.clearFocus()后Activity会再次寻找默认焦点,因此在需要清除焦点时使用以下语句替代:

mEditText.setFocusable(false);
mEditText.setFocusableInTouchMode(true);

 

你可能感兴趣的:(Android)