You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI/Blazor MAUI Hybrid中如何检测硬件键盘是否在使用?

在MAUI中检测硬件键盘是否正在使用的方法

MAUI没有跨平台统一API直接检测硬件键盘,但可以通过平台特定代码分别在Android和iOS上实现检测逻辑,再封装到共享项目中使用。

Android平台实现

Android可通过监听Configuration的键盘状态变化判断硬件键盘是否连接:

  1. 创建平台特定服务类:
using Android.Content;
using Android.Content.Res;

namespace YourAppName.Platforms.Android;

public class HardwareKeyboardDetector
{
    private readonly Configuration _configuration;

    public HardwareKeyboardDetector(Context context)
    {
        _configuration = context.Resources.Configuration;
    }

    public bool IsHardwareKeyboardConnected()
    {
        return _configuration.Keyboard != KeyboardType.Nokeys && 
               _configuration.HardKeyboardHidden != HardKeyboardHidden.Hidden;
    }

    // 可选:监听键盘状态变化
    public void SubscribeToKeyboardChanges(Action<bool> onKeyboardStateChanged)
    {
        var receiver = new KeyboardStateReceiver(onKeyboardStateChanged);
        Application.Context.RegisterReceiver(receiver, new IntentFilter(Intent.ActionConfigurationChanged));
    }

    private class KeyboardStateReceiver : BroadcastReceiver
    {
        private readonly Action<bool> _callback;

        public KeyboardStateReceiver(Action<bool> callback)
        {
            _callback = callback;
        }

        public override void OnReceive(Context? context, Intent? intent)
        {
            if (context == null) return;
            var config = context.Resources.Configuration;
            _callback?.Invoke(config.Keyboard != KeyboardType.Nokeys && config.HardKeyboardHidden != HardKeyboardHidden.Hidden);
        }
    }
}
  1. 共享项目中调用:
#if ANDROID
using YourAppName.Platforms.Android;
#endif

public bool CheckHardwareKeyboard()
{
#if ANDROID
    var detector = new HardwareKeyboardDetector(Platform.CurrentActivity);
    return detector.IsHardwareKeyboardConnected();
#else
    return false;
#endif
}

iOS平台实现

iOS可通过UIApplication的keyboardHardwareType属性判断:

  1. 创建平台特定服务类:
using UIKit;

namespace YourAppName.Platforms.iOS;

public class HardwareKeyboardDetector
{
    public bool IsHardwareKeyboardConnected()
    {
        return UIApplication.SharedApplication.KeyboardHardwareType != UIKeyboardType.None;
    }

    // 可选:监听键盘状态变化
    public void SubscribeToKeyboardChanges(Action<bool> onKeyboardStateChanged)
    {
        NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification, (notification) =>
        {
            onKeyboardStateChanged?.Invoke(UIApplication.SharedApplication.KeyboardHardwareType != UIKeyboardType.None);
        });

        NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillHideNotification, (notification) =>
        {
            onKeyboardStateChanged?.Invoke(false);
        });
    }
}
  1. 共享项目中调用:
#if IOS
using YourAppName.Platforms.iOS;
#endif

public bool CheckHardwareKeyboard()
{
#if IOS
    var detector = new HardwareKeyboardDetector();
    return detector.IsHardwareKeyboardConnected();
#else
    return false;
#endif
}

跨平台封装使用

可以通过接口+依赖注入实现跨平台统一调用:

  1. 定义接口:
public interface IHardwareKeyboardService
{
    bool IsHardwareKeyboardActive();
    void SubscribeToStateChanges(Action<bool> stateChangedCallback);
}
  1. 注册服务(MauiProgram.cs):
builder.Services.AddSingleton<IHardwareKeyboardService>(sp =>
{
#if ANDROID
    return new YourAppName.Platforms.Android.HardwareKeyboardDetector(Platform.CurrentActivity);
#elif IOS
    return new YourAppName.Platforms.iOS.HardwareKeyboardDetector();
#else
    return new DefaultHardwareKeyboardService();
#endif
});

// 默认实现
public class DefaultHardwareKeyboardService : IHardwareKeyboardService
{
    public bool IsHardwareKeyboardActive() => false;
    public void SubscribeToStateChanges(Action<bool> stateChangedCallback) { }
}
  1. 在页面/ViewModel中使用:
private readonly IHardwareKeyboardService _keyboardService;

public YourViewModel(IHardwareKeyboardService keyboardService)
{
    _keyboardService = keyboardService;
}

private void OnSearchBoxFocused()
{
    if (!_keyboardService.IsHardwareKeyboardActive())
    {
        HideExtraUI(); // 隐藏UI组件的逻辑
    }
    else
    {
        ShowExtraUI(); // 保持UI显示的逻辑
    }
}

注意事项

  • Android上硬件键盘状态可能随设备旋转变化,需结合配置变化监听更新状态。
  • iOS上KeyboardHardwareType会在硬件键盘连接/断开时实时更新,结合键盘通知可准确捕获状态变化。

内容的提问来源于stack exchange,提问作者Smith5727

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:52:15