我正在尝试通过继承类库中的编辑文本控件来创建数字文本框控件。我正在使用Keypress事件处理程序来限制用户使用正则表达式仅输入数字,但是Keypress事件不会触发。
我的代码是
类库
public class NumericTextBox : EditText
{
Color backgroundColor = Color.Blue;
Color textColor = Color.White;
public NumericTextBox(Context context) : base(context)
{
textColor = this.TextColor;
backgroundColor = this.BackgroundColor;
KeyPress += new System.EventHandler<View.KeyEventArgs> (NumericTextBox_KeyPress);
}
public Color BackgroundColor
{
get
{
return this.backgroundColor;
}
set
{
this.backgroundColor = value;
}
}
public Color TextColor
{
get
{
return this.textColor;
}
set
{
this.textColor = value;
}
}
public void NumericTextBox_KeyPress(object sender, View.KeyEventArgs e)
{
e.Handled = false;
if(e.Event.Action == KeyEventActions.Down && e.KeyCode == Keycode.Enter)
{
if(System.Text.RegularExpressions.Regex.IsMatch(editText.Text,"[0-9]"))
{
e.Handled = true;
}
else
{
Toast.MakeText(this,"enter only numbers",ToastLength.Long).show();
}
}
MainActivity
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
NumericTextBox onlyNum = new NumericTextBox(BaseContext);
LinearLayout linearLayout = new LinearLayout(this);
TextView textView = new TextView(this);
textView.SetText("Enter only numbers", TextView.BufferType.Normal);
textView.SetTextColor(Android.Graphics.Color.White);
NumericTextBox editText = new NumericTextBox(this);
editText.SetWidth(250);
editText.SetHeight(100);
editText.SetTextColor(Android.Graphics.Color.White);
editText.SetBackgroundColor(Android.Graphics.Color.Blue);
editText.Gravity = Android.Views.GravityFlags.Center;
linearLayout.AddView(textView);
linearLayout.AddView(editText);
SetContentView(linearLayout);
}
数字文本框是一个自定义控件。
答案 0 :(得分:0)
我会做不同的事情。它将为您节省头痛。
我会将键盘设置为数字edit.SetInputType(...)
,其中参数是以下各项之一:https://developer.xamarin.com/api/type/Android.Text.InputTypes根据您要执行的操作,将其设置为Phone或Number *之一将起作用。>
第二,我将使用TextFilter过滤输入。这是一个检查最小/最大的示例,但是您可以过滤几乎所有字符:https://dzone.com/articles/xamarinandroid-implementing
public class MinMaxInputFilter : Java.Lang.Object, IInputFilter
{
private int _min = 0;
private int _max = 0;
public MinMaxInputFilter (int min, int max)
{
_min = min;
_max = max;
}
public Java.Lang.ICharSequence FilterFormatted(
Java.Lang.ICharSequence source,
int start,
int end,
ISpanned dest,
int dstart,
int dend)
{
try
{
string val = dest.ToString().Insert(dstart, source.ToString());
int input = int.Parse(val);
if (IsInRange(_min, _max, input))
return null;
}
catch (Exception ex)
{
Debug.WriteLine ("FilterFormatted Error: " + ex.Message);
}
return new Java.Lang.String (string.Empty);
}
private bool IsInRange(int min, int max, int input)
{
return max > min ? input >= min && input <= max : input >= max && input <= min;
}
}
这样做,您不会让用户输入他们不应该输入的内容,这通常是更好的用户体验。