SOFT_INPUT_STATE_ALWAYS_VISIBLE在android 9.0失效分析

在低版本上,如果啟動Activity/dialog想要自動焦點到編輯框,有很多種方式,其中一種是SOFT_INPUT_STATE_ALWAYS_VISIBLE

mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
                | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

在升級到Android9.0之后,發(fā)現(xiàn)軟鍵盤沒有彈出來,也沒有焦點。
system_process E/InputMethodManagerService: SOFT_INPUT_STATE_ALWAYS_VISIBLE is ignored because there is no focused view that also returns true from View#onCheckIsTextEditor()
看了看源碼,然后百度了下看有沒有哥們已經(jīng)踩坑的,讓我發(fā)現(xiàn)了一篇
Android api 28 9.0 EditText無法自動彈出軟鍵盤(windowSoftInputMod stateAlwaysVisible targetSdkVersion)文章,這個哥們寫的很清晰詼諧.

解決:這個哥們有提到直接對控件進(jìn)行requestFocus,我這邊測試是可行的,可是,如果界面很復(fù)雜,復(fù)雜到你根本就不知道應(yīng)該哪個輸入框拿焦點呢?
我們需要找到第一個該拿到焦點的編輯框??梢允褂眠@個方法:

private boolean mHasFoundFocus = false;
    private void requestFocus(ViewGroup viewGroup) {
        if (viewGroup == null ||mHasFoundFocus) {
            return;
        }
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View view = viewGroup.getChildAt(i);
            if (view instanceof ViewGroup && View.VISIBLE == view.getVisibility()) {
                requestFocus((ViewGroup) view);
            } else if (view instanceof EditText) {
                if (view.requestFocus()) {
                    mHasFoundFocus = true;
                    return;
                }
            }
        }
    }

其實最簡單的還是要弄明白,android 9.0為什么要這么弄,這樣操作之后是不是SOFT_INPUT_STATE_ALWAYS_VISIBLE已經(jīng)沒用了,有大佬知道為蝦米嗎?

2020/5/19 補(bǔ)充一下

有時候看代碼不是注解 真的是浪費(fèi)很多時間哎 ,

/**
         * Visibility state for {@link #softInputMode}: please always make the
         * soft input area visible when this window receives input focus.
         *
         * <p>Applications that target {@link android.os.Build.VERSION_CODES#P} and later, this flag
         * is ignored unless there is a focused view that returns {@code true} from
         * {@link View#isInEditMode()} when the window is focused.</p>
         */
        public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5;

這邊注解明明白白清清楚楚的寫著 在Android P已經(jīng)失效了,除非在edit mode

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容