Android 9 (P ie API-28) новый NavigationBar нестабилен - PullRequest
0 голосов
/ 30 мая 2020

Как стабильно включить иммерсивный режим? Или как исправить нестабильную Android 9 видимость пользовательского интерфейса системы?

Приложение для иммерсивного тестирования

Я сделал приложение для тестирования иммерсивного (-липкого) режима с помощью такого метода:

private void setImmersive() {
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    );
}

Для моего Nexus 6P (Android 8 (API-27)) проблем не было. Но для моего Sony Xperia Ace (Android 9 (API-28)) существует ИНОГДА проблема с вращением экрана. Возможно, это связано с новой обновленной функцией NavigationBar Android 9.

Когда я поворачиваю телефон, но, тем не менее, иммерсивный режим включен, NavigationBar появляется снова, НЕ КАЖДЫЙ, ИНОГДА . (Как ни странно, панель навигации должна быть наполовину темной прозрачной, но эта зомб-багги ie Панель навигации полностью прозрачна.)

screenshot of buggy zombie NavigationBar


Второе тестовое приложение

Затем я создал другое тестовое приложение, чтобы проверить, когда происходит OnSystemUiVisibilityChange.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onResume() {
        super.onResume();
        final Context context = this;
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
            new View.OnSystemUiVisibilityChangeListener() {
                @Override
                public void onSystemUiVisibilityChange(int i) {
                    Toast.makeText(
                        context,
                        String.format("SystemUiVisibilityChanged: %d", i),
                        Toast.LENGTH_SHORT
                    ).show();
                }
            });
    }

    @Override
    protected void onPause() {
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(null);
        super.onPause();
    }
}

Вы видите, что приложение почти скелетно. Для такого приложения система ИНОГДА изменяет видимость пользовательского интерфейса системы! (удаляет все флаги: View.SYSTEM_UI_FLAG_LOW_PROFILE, View.SYSTEM_UI_FLAG_HIDE_NAVIGATION и View.SYSTEM_UI_FLAG_FULLSCREEN)

screenshot


Мое решение

Я понятия не имею, как исправить это нестабильное поведение Android 9, мое быстрое исправление для сохранения иммерсивного режима посредством вращения использует OnSystemUiVisibilityChangeListener для вызова setImmersive() всякий раз, когда видимость пользовательского интерфейса системы сбрасывается до 0:

getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
    new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int i) {
            setImmersive();
        }
    });

Я хочу знать, есть ли для этого более фундаментальное решение. Спасибо.

...