Xamarin.Forms иммерсивный режим Android с программной клавиатурой или предупреждением

Я пытаюсь заставить свое приложение Xamarin.Forms использовать иммерсивный режим Android, поскольку я использую устройство с маленьким экраном, поэтому программные клавиши и панель навигации крадут мое драгоценное пространство на экране.

Поскольку устройство, которое я использую, оснащено аппаратной клавиатурой, я хотел скрыть мягкую клавиатуру. В настоящее время я решил эту проблему, установив клавиатуру "Null Input Method". Однако клавиатура все еще там, поэтому каждый раз, когда запрашивается фокус на элементе Entry, клавиатура «отображается». Это заставляет приложение выйти из иммерсивного режима. То же самое верно, когда я показываю предупреждение из моего приложения форм.

В идеале я бы хотел, чтобы мое приложение все время оставалось в иммерсивном режиме, по крайней мере, когда запрашивается фокус на Entry (мягкая клавиатура вообще не «отображается» или иммерсивный режим не отключается, когда клавиатура «отображается»). Для предупреждений я хотел бы, чтобы приложение повторно входило в иммерсивный режим, когда предупреждение скрыто. В настоящее время я решил эту проблему, расширив класс Page с помощью настраиваемых методов DisplayAlert, которые переключают иммерсивный режим после завершения задачи DisplayAlert.

Я провел небольшое исследование и нашел следующие статьи: Иммерсивный режим при использовании клавиатуры Похоже, управляемый пользователем чтобы решить проблему, значит, может быть решение?

https://forums.xamarin.com/discussion/33034/prevent-entry-soft-keyboard-from-showing-on-android Но это решение не работает с элементами Entry, и я бы хотел избежать написания пользовательских средств визуализации для элементов.

Есть ли кто-нибудь, кто раньше сталкивался с подобной проблемой и сумел ее решить?


person Denis Vitez    schedule 22.08.2018    source источник


Ответы (1)


Это не лучшее решение, но для меня определенно самое простое.

Попробуй это:

final Handler forceImmersive = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {

            // Enables regular immersive mode.
            // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
            // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                            // Set the content to appear under the system bars so that the
                            // content doesn't resize when the system bars hide and show.
                            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            // Hide the nav bar and status bar
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN);

            forceImmersive.postDelayed(this, 1000);
        }
    };

    forceImmersive.postDelayed(runnable, 1000);
person Richard Jenkins    schedule 05.12.2018
comment
Однако его необходимо преобразовать в правильный синтаксис для Xamarin (например, C #), поскольку он выглядит так, как будто он взят из документации Android и, как таковой, находится на Java. - person Digitalsa1nt; 10.05.2019