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"
验证步骤
- 编译并部署到真机测试
- 检查键盘是否显示小数点,且输入后能正常显示在文本框中
- 确认负号(若需要)和数字输入功能正常
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

