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

MAUI Entry组件Android端数字键盘无法输入小数点的问题求助

MAUI Entry数字键盘无法输入小数点的原因及解决办法

核心原因

问题出在Android厂商键盘(尤其是三星键盘)的行为差异:

  • 三星键盘在Android 13及以下版本中,对MAUI默认的Keyboard="Numeric"配置解析存在问题,即使小数点/逗号按钮显示正常,也会拦截输入请求;而Android 14+的三星键盘或第三方键盘(如SwiftKey)遵循标准Android InputType规则,因此可以正常输入。
  • MAUI默认的Keyboard.Numeric在Android端映射的InputType参数,没有强制要求厂商键盘支持小数输入,导致部分厂商自行限制了该功能。

解决方案

方法一:自定义Android Entry Handler(推荐)

通过MAUI的自定义Handler直接为Android端Entry设置精确的InputType,绕过厂商键盘的限制:

  1. 在Android平台项目中创建CustomEntryHandler.cs:
using Android.Widget;
using Microsoft.Maui.Handlers;

namespace YourAppNamespace.Platforms.Android;

public class CustomEntryHandler : EntryHandler
{
    protected override void ConnectHandler(EditText platformView)
    {
        base.ConnectHandler(platformView);
        // 配置支持数字+小数输入的InputType
        platformView.InputType = Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagDecimal;
        // 强制设置小数分隔符为逗号(匹配你的需求)
        var decimalFormat = Java.Text.NumberFormat.GetInstance(Java.Util.Locale.Default) as Java.Text.DecimalFormat;
        decimalFormat?.SetDecimalSeparator(',');
    }
}
  1. 在MauiProgram.cs中注册Handler:
builder.ConfigureMauiHandlers(handlers =>
{
#if ANDROID
    handlers.AddHandler(typeof(Microsoft.Maui.Controls.Entry), typeof(Platforms.Android.CustomEntryHandler));
#endif
});

方法二:使用自定义Decimal键盘

在共享项目中创建自定义Keyboard,明确指定支持小数输入:

using Microsoft.Maui.Controls;

namespace YourAppNamespace;

public class DecimalNumericKeyboard : Keyboard
{
    public static readonly DecimalNumericKeyboard Instance = new();

    private DecimalNumericKeyboard() : base(KeyboardFlags.None)
    {
#if ANDROID
        // 直接指定Android端的InputType
        PlatformId = Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagDecimal;
#endif
    }
}

XAML中使用自定义键盘:

<Entry 
    Text="{Binding Price}"
    Keyboard="{x:Static local:DecimalNumericKeyboard.Instance}" />

方法三:通过行为强制允许小数输入

如果不想修改平台代码,可以用MAUI行为处理输入逻辑,确保逗号能正常输入:

  1. 创建AllowDecimalBehavior.cs:
using Microsoft.Maui.Controls;

namespace YourAppNamespace.Behaviors;

public class AllowDecimalBehavior : Behavior<Entry>
{
    protected override void OnAttachedTo(Entry entry)
    {
        entry.TextChanged += HandleTextChanged;
        base.OnAttachedTo(entry);
    }

    protected override void OnDetachingFrom(Entry entry)
    {
        entry.TextChanged -= HandleTextChanged;
        base.OnDetachingFrom(entry);
    }

    private void HandleTextChanged(object sender, TextChangedEventArgs e)
    {
        var entry = sender as Entry;
        if (string.IsNullOrEmpty(e.NewTextValue))
        {
            entry.Text = "";
            return;
        }

        // 只允许数字和逗号,且只能有一个逗号
        if (!System.Text.RegularExpressions.Regex.IsMatch(e.NewTextValue, @"^[0-9,]*$") || e.NewTextValue.Count(c => c == ',') > 1)
        {
            entry.Text = e.OldTextValue;
        }
    }
}

XAML中引用行为:

<Entry 
    Text="{Binding Price}"
    Keyboard="Numeric">
    <Entry.Behaviors>
        <local:AllowDecimalBehavior />
    </Entry.Behaviors>
</Entry>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:14:50