Скрытая панель навигации в формах xamarin появляется, когда на Android появляется экранная клавиатура

Для проекта нижняя панель навигации в приложении для Android не должна быть видна. Нашел этот код при просмотре, и он работает изначально: это код в MainActivity.cs

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    base.OnCreate(savedInstanceState);
    HideNavAndStatusBar();
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());
}

private void HideNavAndStatusBar()
{
    int uiOptions = (int)Window.DecorView.SystemUiVisibility;
    uiOptions |= (int)SystemUiFlags.LowProfile;
    uiOptions |= (int)SystemUiFlags.Fullscreen;
    uiOptions |= (int)SystemUiFlags.HideNavigation;
    uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
    Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
}

Этот код работает до тех пор, пока при нажатии на запись не появится экранная клавиатура. Это снова показывает панель навигации, и она остается включенной, даже когда клавиатура закрыта. Точно так же, когда нажимается средство выбора, также появляется панель навигации, когда окно выбора закрывается, панель навигации снова исчезает.

Этот код будет использоваться для внутренней системы, и очень важно, чтобы пользователь не мог возиться с ОС Android.

Есть какие нибудь идеи как это починить?


person Gert Hermans    schedule 16.06.2020    source источник
comment
Хотите скрыть нижнюю панель вкладок, как показано на этом снимке экрана?imgur.com/a/w1XB9Br   -  person Leon Lu - MSFT    schedule 16.06.2020
comment
Нет кнопок навигации по умолчанию от Android, чтобы вернуться назад, показать открытые приложения и выйти из приложения.   -  person Gert Hermans    schedule 16.06.2020


Ответы (2)


Этот код работает до тех пор, пока при нажатии на запись не появится экранная клавиатура. Это снова показывает панель навигации, и она остается включенной, даже когда клавиатура закрыта.

Когда вы нажмете Entry или Picker, появится эта панель навигации, ее нельзя изменить. Но если клавиатура или средство выбора исчезают, скройте панель навигации, это можно сделать, как этот GIF.

введите здесь описание изображения

Вы можете снова вызвать метод HideNavAndStatusBar в событии SystemUiVisibilityChange, как показано в следующем коде.

  [Activity(Label = "App31", Icon = "@mipmap/icon", Theme = "@style/MainTheme",WindowSoftInputMode =SoftInput.AdjustPan, MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            HideNavAndStatusBar();

            Window.DecorView.SystemUiVisibilityChange += DecorView_SystemUiVisibilityChange;
            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);          
            LoadApplication(new App());
        }

        private void DecorView_SystemUiVisibilityChange(object sender, View.SystemUiVisibilityChangeEventArgs e)
        {

            HideNavAndStatusBar();
        }


        private void HideNavAndStatusBar()
        {
            int uiOptions = (int)Window.DecorView.SystemUiVisibility;
            uiOptions |= (int)SystemUiFlags.LowProfile;
            uiOptions |= (int)SystemUiFlags.Fullscreen;
            uiOptions |= (int)SystemUiFlags.HideNavigation;
            uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
            uiOptions |= (int)SystemUiFlags.LayoutStable;

            Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
        }
}
person Leon Lu - MSFT    schedule 16.06.2020
comment
Спасибо, это немного улучшает его, но появление панели навигации по-прежнему является проблемой блокировки. - person Gert Hermans; 16.06.2020
comment
Это дизайн Android (вы можете увидеть аннотацию о SYSTEM_UI_FLAG_FULLSCREEN 和SYSTEM_UI_FLAG_HIDE_NAVIGATION): существует ограничение: поскольку элементы управления навигацией очень важны, малейшее взаимодействие с пользователем * приведет к их немедленному появлению. Когда это произойдет, * этот флаг и {@link #SYSTEM_UI_FLAG_FULLSCREEN} будут автоматически сброшены, * так что оба элемента появятся снова одновременно. - person Leon Lu - MSFT; 16.06.2020

Если у вас есть полный контроль над устройством, оно будет работать. Как и в случае с моей проблемой, это лучшее решение, поскольку оно не позволяет нигде всплывать навигации (что может быть проблематично, но в некоторых случаях это может быть именно то, что вам нужно). Если у вас есть рутированное устройство, вы можно использовать мост отладки Android (adb.exe), чтобы всегда удалять панель навигации. Это не позволит пользователю перейти в os.

adb shell pm disable com.android.systemui

Я нашел это в этой ссылке переполнения стека (ответ NartusTeam) Есть ли способ скрыть системную/навигационную панель в Android ICS

person Gert Hermans    schedule 18.06.2020
comment
Если ваше приложение работает на устройстве Android, будут ли все пользователи рутировать свои устройства? - person Leon Lu - MSFT; 18.06.2020
comment
это для специальной машины, а не для игрового магазина или чего-то еще - person Gert Hermans; 18.06.2020
comment
Я вижу, что это не для большинства приложений, но в нашем случае это решение, которое работает. Приложение работает на устройстве, которое мы контролируем - person Gert Hermans; 18.06.2020
comment
Этот ответ просто используется для вашей среды, не подходит для среды использования большинства людей. И в своих вопросах и ответах вы также не дали понять, что ваша среда использования будет вводить в заблуждение других. Я думаю, что мой ответ может подойти для большинства разработчиков. - person Leon Lu - MSFT; 18.06.2020
comment
Хорошо, я возвращаю вам тег ответа и добавляю примечание к моему ответу (что на самом деле лучше решило мою проблему). - person Gert Hermans; 18.06.2020