gpt4 book ai didi

android - 使用逗号作为带有 MvvmCross 的 android EditText 的小数点分隔符

转载 作者:行者123 更新时间:2023-11-29 17:22:09 27 4
gpt4 key购买 nike

我正在使用 Xamarin 和 MvvmCross 开发 Android 应用程序。我有一个这样定义的 EditText:

<EditText
local:MvxBind="Text PorcentagemDesconto"
android:inputType="number|numberDecimal"
android:nextFocusDown="@+id/valorDesconto"
android:layout_width="1dp"
android:layout_weight="0.3"
android:layout_height="wrap_content"
android:hint="%"
android:focusableInTouchMode="true" />

当我点击 EditText 时,键盘没有给我插入 Comma 的选项,只有一个 Dot 可供使用作为小数分隔符。这里的问题是,当我插入数字 2.22 时,Binding 假定该值为 222,因为我的设备使用的是 pt-BR 语言环境,使用逗号表示小数点,使用点表示千位。

我已经做了以下事情来解决这个问题:

创建了一个 ValueConverter 来替换 commadot

public class DecimalValueConverter : MvxValueConverter
{
public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}

public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var strValue = value?.ToString();
if (string.IsNullOrEmpty(strValue))
return null;

strValue = strValue.Replace(".", ",");

return strValue;
}
}

但是这样一来,一旦用户输入第一个十进制数字,光标就会移动到 EditText 的开头,所以,我还使用了 TextChanged 事件EditText 设置输入端的选择来解决这个问题。

var porcentagemDesconto = v.FindViewById<EditText>(Resource.Id.porcentagemDesconto);
porcentagemDesconto.TextChanged += (s, e) =>
{
Activity.RunOnUiThread(() =>
{
if (porcentagemDesconto.Text != null)
{
porcentagemDesconto.SetSelection(porcentagemDesconto.Text.Length);
}
});
};

但老实说,我不喜欢这个解决方案。我需要为所有接受小数的 EditTexts 编写事件代码,或者创建一个自定义 View 来执行此操作。

我很难相信我需要创建一个自定义 View 和一个ValueConverter 只是为了使用逗号作为小数点分隔符,所以,我想知道是否有更好的方法来解决我的问题。

编辑:

我也已经尝试使用 android:digits="0123456789,-",但这样逗号不会出现在键盘上,只会出现在点上。唯一的区别是,通过这种方式,当我点击该点时,什么也没有发生。

最佳答案

这是一个自 2009 年以来未修复的 Android bug

你必须设置android:digits

<EditText
local:MvxBind="Text PorcentagemDesconto"
android:inputType="number|numberDecimal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="%"
android:digits="0123456789,-"
android:focusableInTouchMode="true" />

如果你想为不同的国家部署你的应用程序,你必须使用字符串资源 android:digits="@string/localized_digits

values-de/strings.xml 例如德语

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="localized_digits">0123456789,-</string>
</resources>

values/strings.xml 默认值

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="localized_digits">0123456789.-</string>
</resources>

或者使用更通用的方法并通过代码进行设置:

// extension method
public static class EditTextExtension
{
public static void FixDigits(this EditText text)
{
var decimalSign = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
var digits = $"0123456789{decimalSign}-";
text.KeyListener = DigitsKeyListener.GetInstance(digits);
}
}

// usage
FindViewById<EditText>(Resource.Id.txtNumber).FixDigits();

或者您将扩展方法 FixDigits() 的功能添加到您的自定义 EditText 类中。

关于android - 使用逗号作为带有 MvvmCross 的 android EditText 的小数点分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36155178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com