使用逗号作为Android EditText与MvvmCross的小数分隔符

时间:2016-03-22 13:05:11

标签: android xamarin mvvmcross

我正在使用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,但这样逗号不会出现在键盘上,只会出现在点上。唯一的区别是这样,当我点击点时,没有任何反应。

1 个答案:

答案 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类。