Навигация по погружным режимам становится липким после нажатия на тома или минимизации-восстановления
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
this.getWindow().getDecorView().setSystemUiVisibility(getSystemUiFlags());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private static int getSystemUiFlags() {
return View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| 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;
}
}
После первого запуска
![After first start]()
После нажатия кнопок регулировки громкости или после нажатия последних приложений дважды
![enter image description here]()
Я видел, что приложение QuickPic не имеет этой ошибки. Интересно, как они опустили его.
Ответы
Ответ 1
как для меня, я использую этот код
public void UiChangeListener()
{
final View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
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);
}
}
});
}
и вызвал его onCreate.:)
Ответ 2
У меня была та же проблема, и я решил ее с помощью простого обходного пути. Хотя я не мог найти теоретической причины этого обходного пути, но он все равно работал у меня.
Кажется, что при нажатии кнопки тома "флаги", связанные с "режимом погружения", очищаются. И я думаю, что режим immersive отключен, и режим immersive не восстанавливается автоматически.
Поэтому я попытался установить "флаги" после нажатия кнопки громкости с помощью объекта "runnable".
Итак, он работает следующим образом:
immersive mode → нажата кнопка громкости (флаги очищены) → 500 мс позже, запущенный объект снова устанавливает флаги → восстановлен режим погружения
1. Сначала определите runnable object для установки флагов
private Runnable decor_view_settings = new Runnable()
{
public void run()
{
getWindow().getDecorView().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);
}
};
2. После запуска кнопки тома запустим объект runnable с некоторой задержкой на обработчик
private Handler mHandler = new Handler();
...
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
finish();
}
else if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP)
{
mHandler.postDelayed(decor_view_settings, 500);
}
return super.onKeyDown(keyCode, event);
}
Я просто отложил его на 500 мс без причины, это не важно.
3. Основной код для режима immersive с runnable object
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
if(hasFocus)
{
mHandler.post(decor_view_settings);
}
}
Он отлично работал в моем приложении.
Итак, когда я нажимаю кнопку регулировки громкости, режим immersive отключается, и громкость громкоговорителя появляется.
через несколько секунд регулятор громкости исчезает, а также строка состояния и панель навигации.
Надеюсь, что эта работа для вас.
Ответ 3
Мое решение - установить флаги UI-Visibility в трех местах:
- При получении фокуса
- В onResume
- В слушателе OnSystemUiVisibilityChangeListener
Третий решил мою проблему. Остальные могут быть не нужны, но я их оставил.
Вот что выглядит:
private void setupMainWindowDisplayMode() {
View decorView = setSystemUiVisilityMode();
decorView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
setSystemUiVisilityMode(); // Needed to avoid exiting immersive_sticky when keyboard is displayed
}
});
}
private View setSystemUiVisilityMode() {
View decorView = getWindow().getDecorView();
int options;
options =
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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(options);
return decorView;
}
setupMainWindowDisplayMode() вызывается в onCreate().