按键事件未触发

时间:2018-07-09 16:48:03

标签: c# android xamarin

我正在尝试通过继承类库中的编辑文本控件来创建数字文本框控件。我正在使用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);
    }

数字文本框是一个自定义控件。

1 个答案:

答案 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;
     }
}

这样做,您不会让用户输入他们不应该输入的内容,这通常是更好的用户体验。