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

Первоначально я установил, что моя активность находится в режиме Immersive, со следующим кодом:

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 не имеют никаких проблем с этим. Кто-нибудь знает об этом?

Ответ 1

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

@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(); Теперь строка состояния исчезнет по мере исчезновения вашей клавиатуры.

Ответ 2

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

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.