我一直被三星Galaxy数字键盘的十进制分隔符困扰着。
我有一个Entry
,我必须只接受数值(包括小数),所以在我的xaml代码中,我写了<Entry Keyboard="Numeric"/>
,它在VS19 android模拟器上工作得很好。但是当我在我的物理设备(三星Galaxy S10+)上运行应用程序时,逗号键被禁用,.-
键不起作用(它没有键入任何内容)。
我在网上查了一下,找到了一些解决方案,但没有一个适合我。
解决方案1通过将以下代码添加到App()
(在App.xaml.cs
中),强制应用程序文化为pt-BR(因为我的电话系统语言是巴西葡萄牙语):
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;
}
}
}
此方法将.-
键更改为逗号键,并且它有点工作(它输入a .),但小数点被忽略(如果我输入2.3,应用程序将其接收为23)。
解决方案3这个解决方案,但结果与解决方案2相同。
我也试着把这些解决方案和它们的方差结合起来,但没有什么是它应该的方式。我甚至不关心条目是逗号还是点,我只需要正确接收十进制数。
我们可以改变方式。根据您的解决方案2,条目可以输入.
,因此您可以在条目的UnFocused事件中执行一些操作。//使用Gabic的代码
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"/>