Запретить отображение 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
}
});