如何在 C#(MonoDroid) 中将 EditText 长度限制为 6 个整数和 3 个小数位?
How to limit EditText length to 6 integers and 3 decimal places in C#(MonoDroid)?
你好,我是新来的,不要那么辛苦,我正在Xamarin.Andriod中使用c#创建一个项目。
我正在尝试在 Xamarin.Android (C# / MonoDroid) 中验证 EditText。
我必须满足的条件如下:
'It allows entering 6 integers and 3 decimal places, in a range from 0 to 999999.999'
我在java中找到了一些可能的解决方案(我了解的不多,也没能用C#实现),如下:
TextWatcher with Java
InputFilter with Java
我不知道如何在 C# 中应用它,如果有人可以解释或给我一个简单的例子但在 C# 中。
这是我的 EditText:
```<EditText
android:id="@+id/etVolume"
android:layout_width="@dimen/value_zero"
android:hint="Volumen"
android:textColor="@color/grisPrimario"
android:layout_height="fill_parent"
android:layout_weight="5"
android:textSize="@dimen/fluidListItem_text_size"
android:inputType="numberDecimal"
android:maxLength ="9"
android:textColorHint="@android:color/darker_gray"
android:backgroundTint="@color/grisPrimario"
android:gravity="bottom"
android:layout_marginBottom="-3dp"
android:layout_marginRight="@dimen/fluidListItemMarginRight"/>```
我的片段是这样定义这个 EditText 的:
Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);
etVolume.setFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(6,3)});
但我不明白如何实现该方法。
我看到 java 他们使用 "TextWatcher" 和 "InputFilter" 但我不明白如何将其更改为 C#
非常感谢我在这方面花了几天的时间提供的帮助。
非常感谢您的帮助。
最好在代码中做到这一点,添加一个函数来检查 TextWatcher 内部。因为每当用户键入内容时都会调用它。
在该函数中,您可以检查条件并在条件不满足时显示错误消息。
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// call checkNumber() function here
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
在 C# 中
public class TextWatcher : Java.Lang.Object, ITextWatcher
{
public void AfterTextChanged(IEditable s)
{
//
}
public void BeforeTextChanged(ICharSequence s, int start, int count, int after)
{
//
}
public void OnTextChanged(ICharSequence s, int start, int before, int count)
{
//
}
}
将侦听器添加到您的 EditText
editText.AddTextChangedListener(new TextWatcher());
It allows entering 6 integers and 3 decimal places, in a range from 0 to 999999.999'
我创建了 IInputFilter,你可以看看:
public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
{
private double _min = 0;
private double _max = 0;
public DecimalDigitsInputFilter(double min, double max)
{
_min = min;
_max = max;
}
public ICharSequence FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
{
try
{
string val = dest.ToString().Insert(dstart, source.ToString());
if (val.Contains("."))
{
string[] array = val.Split(".");
string value1 = array[0].ToString();
string value2 = array[1].ToString();
if (value1.Length > 6|| value1=="")
{
}
else
{
if(value2!="" && value2.Length<=3)
{
double input = double.Parse(val);
if (IsInRange(_min, _max, input))
return null;
}
else if(value2=="")
{
if(IsInRange(_min,_max,double.Parse(value1)))
{
return null;
}
}
}
}
else
{
if(val.Length<=6)
{
double input = double.Parse(val);
if (IsInRange(_min, _max, input))
return null;
}
}
}
catch (System.Exception ex)
{
Console.WriteLine("FilterFormatted Error: " + ex.Message);
}
return new Java.Lang.String(string.Empty);
}
private bool IsInRange(double min, double max, double input)
{
return max > min ? input >= min && input <= max : input >= max && input <= min;
}
}
edittext1 = FindViewById<EditText>(Resource.Id.editText1);
edittext1.SetFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(0,999999.999) });
使用InputFilter解决如下:
在片段中:
public EditText Volume;
Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);
Volume.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(6, 3) });
public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
{
string regexStr = string.Empty;
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero)
{
regexStr = "^[0-9]{0," + (digitsBeforeZero) + "}([.][0-9]{0," + (digitsAfterZero - 1) + "})?$";
}
public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
{
Regex regex = new Regex(regexStr);
if (regex.IsMatch(dest.ToString()) || dest.ToString().Equals(""))
{
if (dest.ToString().Length < 6 && source.ToString() != ".")
{
return new Java.Lang.String(source.ToString());
}
else if (source.ToString() == ".")
{
return new Java.Lang.String(source.ToString());
}
else if (dest.ToString().Length >= 7 && dest.ToString().Length <= 10)
{
return new Java.Lang.String(source.ToString());
}
else
{
return new Java.Lang.String(string.Empty);
}
}
return new Java.Lang.String(string.Empty);
}
}
在AXML
<EditText
android:id="@+id/etVolume"
android:layout_width="@dimen/value_zero"
android:hint="Volumen"
android:textColor="@color/grisPrimario"
android:layout_height="fill_parent"
android:layout_weight="5"
android:textSize="@dimen/fluidListItem_text_size"
android:inputType="numberDecimal"
android:maxLength ="10"
android:textColorHint="@android:color/darker_gray"
android:backgroundTint="@color/grisPrimario"
android:gravity="bottom"
android:layout_marginBottom="-3dp"
android:layout_marginRight="@dimen/fluidListItemMarginRight"/>
可以通过更好地修改和构建 ReGex 来改进此响应并删除过滤器。
它完全有效。输入小数点后6位后不允许输入更多的值,条件只允许输入点(.),然后输入小数点后3位。
我认为如果您创建一个更好的 RegEx,它会更干净。
修改我有一个条件,即要更改整数,必须删除整个值。
如果你有一个更清晰的答案,我希望看到它来实现它。
你好,我是新来的,不要那么辛苦,我正在Xamarin.Andriod中使用c#创建一个项目。
我正在尝试在 Xamarin.Android (C# / MonoDroid) 中验证 EditText。
我必须满足的条件如下: 'It allows entering 6 integers and 3 decimal places, in a range from 0 to 999999.999'
我在java中找到了一些可能的解决方案(我了解的不多,也没能用C#实现),如下:
TextWatcher with Java
InputFilter with Java
我不知道如何在 C# 中应用它,如果有人可以解释或给我一个简单的例子但在 C# 中。
这是我的 EditText:
```<EditText
android:id="@+id/etVolume"
android:layout_width="@dimen/value_zero"
android:hint="Volumen"
android:textColor="@color/grisPrimario"
android:layout_height="fill_parent"
android:layout_weight="5"
android:textSize="@dimen/fluidListItem_text_size"
android:inputType="numberDecimal"
android:maxLength ="9"
android:textColorHint="@android:color/darker_gray"
android:backgroundTint="@color/grisPrimario"
android:gravity="bottom"
android:layout_marginBottom="-3dp"
android:layout_marginRight="@dimen/fluidListItemMarginRight"/>```
我的片段是这样定义这个 EditText 的:
Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);
etVolume.setFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(6,3)});
但我不明白如何实现该方法。
我看到 java 他们使用 "TextWatcher" 和 "InputFilter" 但我不明白如何将其更改为 C#
非常感谢我在这方面花了几天的时间提供的帮助。
非常感谢您的帮助。
最好在代码中做到这一点,添加一个函数来检查 TextWatcher 内部。因为每当用户键入内容时都会调用它。
在该函数中,您可以检查条件并在条件不满足时显示错误消息。
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// call checkNumber() function here
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
在 C# 中
public class TextWatcher : Java.Lang.Object, ITextWatcher
{
public void AfterTextChanged(IEditable s)
{
//
}
public void BeforeTextChanged(ICharSequence s, int start, int count, int after)
{
//
}
public void OnTextChanged(ICharSequence s, int start, int before, int count)
{
//
}
}
将侦听器添加到您的 EditText
editText.AddTextChangedListener(new TextWatcher());
It allows entering 6 integers and 3 decimal places, in a range from 0 to 999999.999'
我创建了 IInputFilter,你可以看看:
public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
{
private double _min = 0;
private double _max = 0;
public DecimalDigitsInputFilter(double min, double max)
{
_min = min;
_max = max;
}
public ICharSequence FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
{
try
{
string val = dest.ToString().Insert(dstart, source.ToString());
if (val.Contains("."))
{
string[] array = val.Split(".");
string value1 = array[0].ToString();
string value2 = array[1].ToString();
if (value1.Length > 6|| value1=="")
{
}
else
{
if(value2!="" && value2.Length<=3)
{
double input = double.Parse(val);
if (IsInRange(_min, _max, input))
return null;
}
else if(value2=="")
{
if(IsInRange(_min,_max,double.Parse(value1)))
{
return null;
}
}
}
}
else
{
if(val.Length<=6)
{
double input = double.Parse(val);
if (IsInRange(_min, _max, input))
return null;
}
}
}
catch (System.Exception ex)
{
Console.WriteLine("FilterFormatted Error: " + ex.Message);
}
return new Java.Lang.String(string.Empty);
}
private bool IsInRange(double min, double max, double input)
{
return max > min ? input >= min && input <= max : input >= max && input <= min;
}
}
edittext1 = FindViewById<EditText>(Resource.Id.editText1);
edittext1.SetFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(0,999999.999) });
使用InputFilter解决如下:
在片段中:
public EditText Volume;
Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);
Volume.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(6, 3) });
public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
{
string regexStr = string.Empty;
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero)
{
regexStr = "^[0-9]{0," + (digitsBeforeZero) + "}([.][0-9]{0," + (digitsAfterZero - 1) + "})?$";
}
public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
{
Regex regex = new Regex(regexStr);
if (regex.IsMatch(dest.ToString()) || dest.ToString().Equals(""))
{
if (dest.ToString().Length < 6 && source.ToString() != ".")
{
return new Java.Lang.String(source.ToString());
}
else if (source.ToString() == ".")
{
return new Java.Lang.String(source.ToString());
}
else if (dest.ToString().Length >= 7 && dest.ToString().Length <= 10)
{
return new Java.Lang.String(source.ToString());
}
else
{
return new Java.Lang.String(string.Empty);
}
}
return new Java.Lang.String(string.Empty);
}
}
在AXML
<EditText
android:id="@+id/etVolume"
android:layout_width="@dimen/value_zero"
android:hint="Volumen"
android:textColor="@color/grisPrimario"
android:layout_height="fill_parent"
android:layout_weight="5"
android:textSize="@dimen/fluidListItem_text_size"
android:inputType="numberDecimal"
android:maxLength ="10"
android:textColorHint="@android:color/darker_gray"
android:backgroundTint="@color/grisPrimario"
android:gravity="bottom"
android:layout_marginBottom="-3dp"
android:layout_marginRight="@dimen/fluidListItemMarginRight"/>
可以通过更好地修改和构建 ReGex 来改进此响应并删除过滤器。
它完全有效。输入小数点后6位后不允许输入更多的值,条件只允许输入点(.),然后输入小数点后3位。
我认为如果您创建一个更好的 RegEx,它会更干净。
修改我有一个条件,即要更改整数,必须删除整个值。
如果你有一个更清晰的答案,我希望看到它来实现它。