Как стабильно включить иммерсивный режим? Или как исправить нестабильную 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 Панель навигации полностью прозрачна.)
Второе тестовое приложение
Затем я создал другое тестовое приложение, чтобы проверить, когда происходит 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
)
Мое решение
Я понятия не имею, как исправить это нестабильное поведение Android 9, мое быстрое исправление для сохранения иммерсивного режима посредством вращения использует OnSystemUiVisibilityChangeListener
для вызова setImmersive()
всякий раз, когда видимость пользовательского интерфейса системы сбрасывается до 0:
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int i) {
setImmersive();
}
});
Я хочу знать, есть ли для этого более фундаментальное решение. Спасибо.