Как повторно включить клавиатуру для элементов управления вводом после их отключения?

У меня есть приложение со штрих-кодом, в котором мне нужно отключить клавиатуру для контроля входа.

Я нашел это, и оно отлично работает. Запретить открытие программной клавиатуры при нажатии на поле ввода в MAUI?

var builder = MauiApp.CreateBuilder();
    builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
        fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
    });
    Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("NoKeyboardEntry", (handler, entry) =>
    {
        #if ANDROID
            handler.PlatformView.ShowSoftInputOnFocus = false;
        #endif
    })

Но мне также приходится поддерживать режим ручного ввода.

Я попробовал это, но это не работает.

MyEntry.ShowKeyboardAsync(CancellationToken.None);

Как включить клавиатуру во время работы приложения после ее отключения при запуске с помощью этого метода?

Редактировать: Так много людей спрашивали о том, как с этим справиться, поэтому вот мое решение о том, как использовать запись для получения входных данных сканирования штрих-кода HID. У меня есть флажок «Сохранить фокус», который, если он установлен, удерживает фокус на элементе «Ввод» и ПОЛНОСТЬЮ ОТКЛЮЧАЕТ отображение программной клавиатуры для одного элемента управления «Ввод»! Если флажок снят, клавиатура снова включается для ввода. Идеальный!

ОГРОМНОЕ спасибо Лиюнь Чжану за включение/отключение клавиатуры.

// For HID barcode scanning
// Checking this checkbox will
// Keep the focus on the barcode Entry and
// Also disable the Entry keyboard!
<CheckBox x:Name = "cb_KeepFocus" CheckedChanged = "OnKeepFocusClicked"/>

// Entry that accepts the HID barcode
<Entry x:Name = "tx_ConfirmationNumber"/>

public MainPage()
{
    InitializeComponent();

    // If the barcode Entry looses focus set it back every 3 seconds
    var KeepFocusTimer = Application.Current.Dispatcher.CreateTimer();
    KeepFocusTimer.Interval = TimeSpan.FromSeconds(3);
    KeepFocusTimer.Tick += (s, e) => OnKeepFocusTimer();
    KeepFocusTimer.Start();
}

private void    OnKeepFocusTimer()
{
    MainThread.BeginInvokeOnMainThread(() =>
    {
        if (cb_KeepFocus.IsChecked)
            // Only set the focus if it isn't already set
            if (!tx_ConfirmationNumber.IsFocused)
                tx_ConfirmationNumber.Focus();
    });
}

// Turns on and off the keep focus and keyboard for the HID Entry
private void    OnKeepFocusClicked(object sender, CheckedChangedEventArgs e)
{
    if (cb_KeepFocus.IsChecked && (!tx_ConfirmationNumber.IsFocused))
        tx_ConfirmationNumber.Focus();
    if (cb_KeepFocus.IsChecked)
        DisableKeyboard();
    else
        EnableKeyboard();
}

private void DisableKeyboard()
{
    #if ANDROID
        (tx_ConfirmationNumber.Handler.PlatformView as AndroidX.AppCompat.Widget.AppCompatEditText).ShowSoftInputOnFocus = false;
    #endif
}
private void EnableKeyboard()
{
    #if ANDROID
        (tx_ConfirmationNumber.Handler.PlatformView as AndroidX.AppCompat.Widget.AppCompatEditText).ShowSoftInputOnFocus = true;
    #endif
}

50
1

Ответ:

Решено

Самый простой способ сделать это — использовать следующий код:

#if ANDROID
     ( MyEntry.Handler.PlatformView as AndroidX.AppCompat.Widget.AppCompatEditText).ShowSoftInputOnFocus = true;
#endif

И вы также можете настроить обработчик, чтобы отключить или включить его:

CustomHandler.cs:

namespace MauiAppTest.Platforms.Android
{
    public class MyHandler : EntryHandler
    {
        public void DisableKeyboard()
        {
            PlatformView.ShowSoftInputOnFocus = false;
        }
        public void EnableKeyboard()
        {
            PlatformView.ShowSoftInputOnFocus = true;
        }
    }
}

Используйте его в MauiProgram.cs:

builder
                .UseMauiApp<App>()
                .UseMauiCommunityToolkit()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                })
                .ConfigureMauiHandlers((handlers) =>
                {
#if ANDROID
                    handlers.AddHandler(typeof(Entry),typeof(Platforms.Android.MyHandler));
#endif
                });

Вызовите метод в коде:

#if ANDROID
    (MyEntry.Handler as Platforms.Android.MyHandler).DisableKeyboard();
#endif

Кроме того, когда вы меняете свойство, вам необходимо перефокусировать запись, чтобы отобразить KeyBoard.