我正在使用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
时,键盘不会让我选择插入逗号,只能使用点作为小数分隔符。这里的问题是,当我插入数字 2.22 时,Binding假定值 222 ,因为我的设备正在使用 pt-BR < / strong> locale,使用逗号表示小数位数和点数。
我已经做了以下事情来解决问题:
创建ValueConverter
替换逗号的点
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
的{{1}}事件}在输入的末尾设置选择以解决这个问题。
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
只是为了使用逗号作为小数点分隔符,所以,我想知道如果有更好的方法来解决我的问题。
修改
我也已尝试使用ValueConverter
,但这样逗号不会出现在键盘上,只会出现在点上。唯一的区别是这样,当我点击点时,没有任何反应。
答案 0 :(得分:3)
这是Android bug,自2009年以来一直没有。
您必须设置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()
的thr功能添加到自定义EditText类。