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

Xamarin Android Entry控件无法显示正确数字小数键盘求助

解决Xamarin Syncfusion BorderlessEntry小数点无法输入的问题

可能原因

  • Xamarin默认的Keyboard.Numeric在Android真机上并未自动启用小数点输入权限,需手动指定Android原生的InputType
  • 自定义的NumberEntryBehavior可能拦截了小数点字符,导致无法输入到文本框

解决方案

1. 自定义Android渲染器设置InputType

创建自定义渲染器覆盖BorderlessEntry的Android端配置,强制启用小数点输入:

[assembly: ExportRenderer(typeof(BorderlessEntry), typeof(CustomBorderlessEntryRenderer))]
namespace YourAppNamespace.Droid.Renderers
{
    public class CustomBorderlessEntryRenderer : BorderlessEntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            
            if (Control == null) return;
            
            // 启用数字+小数点输入,如需负号可添加NumberFlagSigned
            Control.InputType = Android.Text.InputTypes.ClassNumber 
                               | Android.Text.InputTypes.NumberFlagDecimal;
            // 若需要支持负号,取消注释下面一行
            // Control.InputType |= Android.Text.InputTypes.NumberFlagSigned;
        }
    }
}

2. 检查并修正NumberEntryBehavior的输入验证逻辑

打开NumberEntryBehavior代码,确保验证正则允许小数点输入:

public class NumberEntryBehavior : Behavior<Entry>
{
    public static readonly BindableProperty IsValidProperty =
        BindableProperty.Create(nameof(IsValid), typeof(bool), typeof(NumberEntryBehavior), false);

    public bool IsValid
    {
        get => (bool)GetValue(IsValidProperty);
        set => SetValue(IsValidProperty, value);
    }

    protected override void OnAttachedTo(Entry bindable)
    {
        base.OnAttachedTo(bindable);
        bindable.TextChanged += OnTextChanged;
    }

    protected override void OnDetachingFrom(Entry bindable)
    {
        base.OnDetachingFrom(bindable);
        bindable.TextChanged -= OnTextChanged;
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        // 正则允许:可选负号 + 任意数字(可空) + 可选小数点 + 任意数字(可空)
        var validNumberRegex = new Regex(@"^-?\d*\.?\d*$");
        
        if (!validNumberRegex.IsMatch(e.NewTextValue))
        {
            ((Entry)sender).Text = e.OldTextValue;
        }

        // 更新验证状态,排除空字符串的情况
        IsValid = validNumberRegex.IsMatch(e.NewTextValue) && !string.IsNullOrWhiteSpace(e.NewTextValue);
    }
}

3. 直接在XAML中设置Android平台特定属性(可选)

如果不想写渲染器,也可以通过PlatformSpecific直接指定InputType:

<control:BorderlessEntry
    x:Name="StretchRatioLenEntry"
    Placeholder="(Es. 3,3)"
    Style="{StaticResource BorderlessEntryStyle}"
    Text="{Binding StretchRatioLen.Value}" 
    PlaceholderColor="#7B7B7B">
    <Entry.Behaviors>
        <behaviour:NumberEntryBehavior IsValid="{Binding StretchRatioLen.IsValid}" />
    </Entry.Behaviors>
    <!-- Android平台特定配置 -->
    <control:BorderlessEntry.OnThisPlatform>
        <Android:Entry.InputType>Number|NumberDecimal</Android:Entry.InputType>
    </control:BorderlessEntry.OnThisPlatform>
</control:BorderlessEntry>

注意:使用此方式需要在XAML头部引入Android命名空间:

xmlns:Android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"

验证步骤

  1. 编译并部署到真机测试
  2. 检查键盘是否显示小数点,且输入后能正常显示在文本框中
  3. 确认负号(若需要)和数字输入功能正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:23:26