如何解决 Galaxy 数字键盘噩梦

How to solve the Galaxy numeric keyboard nightmare

我一直在与 Samsung Galaxy 数字键盘小数点分隔符噩梦作斗争。

我有一个 Entry,我必须只接受数值(包括小数),所以在我的 xaml 代码中我写了 <Entry Keyboard="Numeric"/>,它在 VS19 上工作得很好android模拟器。但是当我 运行 我的物理设备 (Samsung Galaxy S10+) 上的应用程序时,逗号键被禁用并且 .- 键不起作用(它不输入任何内容)。

我在网上进行了一些挖掘并找到了一些解决方案,但 none 对我有用。

解决方案 1 通过将此代码添加到 App()(在 App.xaml.cs 中)强制应用文化为 pt-BR(因为我的 phone 系统语言是巴西葡萄牙语):

private void SetCultureToPTBR()
{
    CultureInfo br = new CultureInfo("pt-BR");
    CultureInfo.DefaultThreadCurrentCulture = br;
}

但是没有任何变化。

解决方案 2 在条目的自定义渲染器上设置输入类型:

[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntryRenderer))]
namespace AppCoperNitro.Droid.CustomRenderers
{
    public class CustomEntryRenderer : EntryRenderer
    {
        public CustomEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control == null || e.NewElement == null)
                return;
            
            this.Control.KeyListener = DigitsKeyListener.GetInstance(true, true);
            this.Control.InputType = Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagDecimal;
        }
    }
}

此方法将 .- 键更改为逗号键,它有点管用(键入 .),但小数位将被忽略(如果我键入 2.3,应用程序将其接收为 23)。

解决方案 3 ,但结果与方案二相同

我也试过结合这些解决方案及其差异,但没有任何效果。我什至不关心条目显示的是逗号还是点,我只需要正确接收十进制数即可。

我们可以改变方式。根据您的解决方案 2,条目可以输入 .,因此您可以在条目的 UnFocused 事件中执行某些操作。如: // 使用gabic的code

 private void Entry_Unfocused(object sender, FocusEventArgs e)
    {
        Entry entry = sender as Entry;
        if (entry.Text.Length > 0 && Android.OS.Build.Manufacturer.Equals("Samsung", StringComparison.CurrentCultureIgnoreCase)) 
           { 
              string a = entry.Text.Replace('.', ',');
              entry.Text = a; 
           }
    }

然后将事件添加到xaml:

<Entry Keyboard="Numeric" Unfocused="Entry_Unfocused"/>