Строка состояния появляется, когда программная клавиатура появляется, но не скрыта, когда программная клавиатура исчезает в режиме иммерсивного режима

Сначала я установил свою активность в режиме погружения со следующим кодом:

View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_FULLSCREEN
    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

Все работает нормально, пока пользователь не нажмет на EditText и не появится программная клавиатура. Это приводит к тому, что строка состояния остается наверху и никогда не прячется назад даже после исчезновения программной клавиатуры. Как ни странно, я сталкиваюсь с этой проблемой только на телефонах LG/Samsung, у телефонов Sony с этим проблем нет. У кого-нибудь есть идеи по этому поводу?

2 ответа

Используйте режим погружения, как это.

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        immersiveMode();
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener
            (new View.OnSystemUiVisibilityChangeListener() {
                @Override
                public void onSystemUiVisibilityChange(int visibility) {
                    immersiveMode();
                }
            });
    }

Вот ваша функция режима погружения.

public void immersiveMode() {
        final View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);
              }

Также вызовите immersiveMode() в OnResume (); Теперь строка состояния исчезнет, ​​как исчезнет ваша клавиатура.

Вот мое решение для этого; Сначала я проверил, отображается ли программная клавиатура или нет:

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
            int screenHeight = getWindow().getDecorView().getRootView().getHeight();

            int keypadHeight = screenHeight - r.bottom;

            //Log.d(TAG, "keypadHeight = " + keypadHeight);

            if (keypadHeight > screenHeight * 0.15) { 
                 //Keyboard is opened
                 hideNavBar();
            }
            else {
                // keyboard is closed
            }
        }
    });

И у меня есть метод hideNavBar(), который запускается при обнаружении программной клавиатуры.

private void hideNavBar() {
if (Build.VERSION.SDK_INT >= 19) {
    View v = getWindow().getDecorView();
    v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

}

Это решает проблему получения навигационной панели, когда есть Edittext для ввода.