Не получается убрать системную панель навигации при открытии DialogFragment
Есть довольно простая строчка кода, которая скрывает навигационную панель:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
Когда она выполняется в onResume в Activity, всё работает. Но у меня также есть DialogFragment'ы, при открытии которых они перекрывают собой активити и, как я понимаю, активити теряет фокус и кнопки навигации снова появляются
Я честно искал ответы, на stackoverflow нашёл ответов 5, и все не подошли.
Итак, чтобы не было ко мне претензий, мол, спрашиваю ерунду, опишу, что я конкретно пробовал.
- Первым делом я пробовал запустить код из onResume самого DialogFragment'а, добавив перед ним
getActivity()
:
getActivity().getWindow().getDecorView().setSystemUiVisibility(...);
Ошибки компиляции не было (я наивно этому обрадовался) но код не сработал.
Далее я попробовал вызвать эту строчку во время создания диалога в самом активити:
DialogFragmentActivity dialog = new DialogFragmentActivity(); Bundle args = new Bundle(); args.putString("всякие аргументы", всякие значения аргументов); dialog.setArguments(args); dialog.getActivity().getWindow().getDecorView().setSystemUiVisibility(...); dialog.show(getSupportFragmentManager(), "Текст");
Это тоже не сработало
В одном из ответов на stackoverflow советовали поиграть с фокусом самого окна. Дескать, сначала снимите фокусировку, установите флаги на скрытие системной навигации, а потом верните фокусировку. Я попробовал:
DialogFragmentActivity dialog = new
DialogFragmentActivity();
Bundle args = new Bundle();
args.putString(...);
dialog.setArguments(args);
dialog.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
dialog.getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
dialog.show(getSupportFragmentManager(), "Текст");
dialog.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
Тоже не сработало
- Также пробовал точно такой же код, как выше, но убрал
dialog.getActivity()
- то есть вызывалgetWindow()
напрямую. Тоже не помогло
Мне уже, честно говоря, надоело пытаться разобраться в этих хитросплетениях садистов, разрабатывавших андроид. Я просто хочу, чтобы при открытии чёртового диалогового окна не появлялась системная навигация, неужели я так много хочу? К сожалению, всё, что бы я ни находил на stackoverflow, или ещё где-то в интернете, не работает. На всякий случай я построчно сравнивал коды из примеров, чтобы не было проволочек - всё равно ее работает. А главное, никаких ошибок и вылетов нет, приложение будто просто игнорирует этот код, выполняясь дальше. Помогите
Ответы (1 шт):
После долгих и измученных часов поиска я обнаружил, что проблема была в маааленькой детали: нужно вместо getActivity() использовать getDialog(). К сожалению, никто и нигде, ни в одном из ответов на stackoverflow, не написал об этом. Поэтому считаю, что эта информация важна (как минимум, для новичков) и пишу её здесь
Вот код, который, наконец, заработал!:
getDialog().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
P. S. Правда, у него есть побочный эффект - навигационная панель появляется примерно на 1/10 секунды, что не очень красиво, поэтому до конца проблема не решена и я уверен, есть более эффективные решения уж для такой популярной ОС, кау андроид. Буду искать, а пока приму это как промежуточный ответ, ведь цель всё же достигнута