如何解决 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"/>
我一直在与 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"/>