Запретить отображение SoftKeyboard в .NET MAUI, ориентированном на ввод.

Мне нужно скрыть программную клавиатуру, когда запись ориентирована на Net MAUI на .net7 в Android, чтобы вводить данные со сканера штрих-кода.

До сих пор я пытался отключить/включить вход при фокусировке, но поведение было неправильным.

Я также попробовал KeyBoardHelper, который нашел с тем же поведением (курсор не отображается или когда запись сфокусирована, я изменил цвет фона, и с помощью этого помощника он не меняется).

      public static partial class KeyboardHelper
    {
        public static void HideKeyboard()
        {
            var context = Platform.AppContext;
            var inputMethodManager = context.GetSystemService(Context.InputMethodService) as InputMethodManager;
            if (inputMethodManager != null)
            {
                var activity = Platform.CurrentActivity;
                var token = activity.CurrentFocus?.WindowToken;
                inputMethodManager.HideSoftInputFromWindow(token, HideSoftInputFlags.None);
                activity.Window.DecorView.ClearFocus();
            }
        }
    }

Есть ли другой способ запретить отображение клавиатуры, когда запись находится в фокусе?

3 ответа

Вы можете написатьHandlerвMauiProgram.csфайл для управления записью.

       Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("MyCustomization", (handler, view) =>
        {
#if ANDROID
            handler.PlatformView.ShowSoftInputOnFocus = false;
#endif
        });
      Put this in your \Platforms\Android\MainActivity.cs:
-------------------------------------------------------

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        KeyboardService.lastContext = this;
        ....
    }
       
    public void HideKeyboard()
    {
        try
        {
            InputMethodManager imm = (InputMethodManager)GetSystemService(InputMethodService);
            imm.HideSoftInputFromWindow(CurrentFocus.WindowToken, HideSoftInputFlags.None);
        }
        catch
        { }
    }

    public void ShowKeyboard(Android.Views.View view)
    {
        try
        {
            InputMethodManager imm = (InputMethodManager)GetSystemService(InputMethodService);
            view.RequestFocus();
            imm.ShowSoftInput(view, 0);
            imm.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
        }
        catch (Exception e) { }
    }


Create a new file \Platforms\Android\Services\KeyboardService.cs
-----------------------------------------------------------------

using Android.Content;
using Android.OS;
using Android.Views;

internal static partial class KeyboardService
{
    public static Context lastContext;
    public static bool KeyboardIsVisible = false;

    public static void HideKeyboard()
    {
        ((MainActivity)lastContext).HideKeyboard();
        KeyboardIsVisible = false;
    }

    public static void ShowKeyboard(Entry entry)
    {
        ((MainActivity)lastContext).ShowKeyboard((Android.Views.View)entry.Handler.PlatformView);
        KeyboardIsVisible = true;
    }
}




create the empty counterpart file on the "non android" side (for each platform used) f.e.: yourProject\Services\KeyboardService.cs
----------------------------------------------------------------------------------------------------------------------------------

internal static partial class KeyboardService
{
}



Call the android functions anywhere you need to:
--------------------------------------------------------
 KeyboardService.HideKeyboard();

 KeyboardService.ShowKeyboard(MyEntryFieldName);

ВEntryобработчик:

      handler.PlatformView.ShowSoftInputOnFocus = false;

Или настройте элемент управления наPageили вMauiProgramиспользуя картограф свойств:

      Microsoft.Maui.Handlers.EntryHandler.Mapper
  .AppendToMapping("ShowSoftInputOnFocus", (handler, view) =>
{
  if (view is Entry entry)
  {
#if ANDROID
    handler.PlatformView.ShowSoftInputOnFocus = false;
#endif
  }
});
Другие вопросы по тегам