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

Xamarin Forms数字键盘如何在Android端启用空格和短横线输入?

问题原因

Xamarin.Forms 中默认的Numeric键盘在Android平台底层会将输入控件的InputType设置为仅允许纯数字输入,系统会自动过滤空格、短横线等非数字字符,所以即使键盘上有对应按键也无法输入内容。
高亮标注的待启用按键

解决方案

以下提供两种适配Android平台的实现方案,可根据项目需求选择:

方案1:共享项目自定义键盘(无需原生代码)

直接在共享项目中自定义允许输入的字符集,不需要编写Android端原生代码:

  1. 在共享项目中添加静态键盘定义类:
public static class BarcodeKeyboard
{
    // 仅允许输入数字、短横线、空格
    public static Keyboard Instance { get; } = Keyboard.Create(KeyboardFlags.None, allowedCharacters: "0123456789- ");
}
  1. 修改原Entry的XML配置,替换原Keyboard="Numeric"属性:
<Entry
    x:Name="BarcodeEntry"
    Margin="12,0"
    HeightRequest="40"
    Placeholder="Barcode"
    Style="{StaticResource BorderlessEntryStyle}"
    Keyboard="{x:Static local:BarcodeKeyboard.Instance}"
    Text="{Binding Barcode.Value, Mode=TwoWay}">

注意:该方案兼容性依赖输入法实现,部分第三方输入法可能不会自动弹出数字键盘,更推荐使用方案2。

方案2:Android自定义Renderer(稳定优先)

通过自定义EntryRenderer修改Android端原生输入控件的配置,保证弹出数字键盘同时允许指定字符输入:

  1. 共享项目中添加自定义Entry类(仅用于标记,无需额外逻辑):
public class BarcodeEntry : Entry
{
}
  1. 在Android项目中添加对应自定义Renderer:
using Android.Content;
using Android.Text.Method;
using Android.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

// 替换为你自己项目的命名空间
[assembly: ExportRenderer(typeof(BarcodeEntry), typeof(YourAppNamespace.Droid.Renderers.BarcodeEntryRenderer))]
namespace YourAppNamespace.Droid.Renderers
{
    public class BarcodeEntryRenderer : EntryRenderer
    {
        public BarcodeEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                // 保留数字键盘布局
                Control.InputType = global::Android.Text.InputTypes.ClassNumber | global::Android.Text.InputTypes.NumberFlagSigned;
                // 自定义允许输入的字符
                Control.KeyListener = DigitsKeyListener.GetInstance("0123456789- ");
            }
        }
    }
}
  1. 修改XML中的Entry为自定义控件:
<local:BarcodeEntry
    x:Name="BarcodeEntry"
    Margin="12,0"
    HeightRequest="40"
    Placeholder="Barcode"
    Style="{StaticResource BorderlessEntryStyle}"
    Text="{Binding Barcode.Value, Mode=TwoWay}">
额外补充:输入校验

为了避免用户粘贴非法字符,可以在ViewModel的属性赋值时增加过滤逻辑:

private string _barcode;
public string Barcode
{
    get => _barcode;
    set 
    { 
        var filteredValue = new string(value?.Where(c => char.IsDigit(c) || c == '-' || c == ' ').ToArray() ?? System.Array.Empty<char>());
        SetProperty(ref _barcode, filteredValue); 
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:09:00