Не получается убрать системную панель навигации при открытии DialogFragment

Есть довольно простая строчка кода, которая скрывает навигационную панель:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

Когда она выполняется в onResume в Activity, всё работает. Но у меня также есть DialogFragment'ы, при открытии которых они перекрывают собой активити и, как я понимаю, активити теряет фокус и кнопки навигации снова появляются

Я честно искал ответы, на stackoverflow нашёл ответов 5, и все не подошли.

Итак, чтобы не было ко мне претензий, мол, спрашиваю ерунду, опишу, что я конкретно пробовал.

  1. Первым делом я пробовал запустить код из onResume самого DialogFragment'а, добавив перед ним getActivity():

getActivity().getWindow().getDecorView().setSystemUiVisibility(...);

Ошибки компиляции не было (я наивно этому обрадовался) но код не сработал.

  1. Далее я попробовал вызвать эту строчку во время создания диалога в самом активити:

    DialogFragmentActivity dialog = new DialogFragmentActivity();
    Bundle args = new Bundle();
    
    args.putString("всякие аргументы", всякие значения аргументов);
    
    dialog.setArguments(args);
     dialog.getActivity().getWindow().getDecorView().setSystemUiVisibility(...);
    
    dialog.show(getSupportFragmentManager(), "Текст");
    

    Это тоже не сработало

  2. В одном из ответов на 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);

Тоже не сработало

  1. Также пробовал точно такой же код, как выше, но убрал 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 секунды, что не очень красиво, поэтому до конца проблема не решена и я уверен, есть более эффективные решения уж для такой популярной ОС, кау андроид. Буду искать, а пока приму это как промежуточный ответ, ведь цель всё же достигнута

→ Ссылка