【问题标题】:UITextField KeyPress Handler in Xamarin.IOSXamarin.IOS 中的 UITextField KeyPress 处理程序
【发布时间】:2018-03-28 16:49:55
【问题描述】:

在我的 xamarin.android 项目中,我有一个使用了 edittext 的屏幕,它的类型是 numberdecimal。在这里,我在 keyPress 上获取 textchanged 事件并附加 使用下面的方法向左编号。 这是代码。

namespace MobileApplication.Droid
{
    [Activity(Label = "TransferScreen2Activity", ScreenOrientation = ScreenOrientation.Portrait, Theme = "@style/MyTheme")]
    public class TransferScreenActivity : BaseActivity, IOnTouchListener
    {
    Button _nextButton;      
    EditText _amountEditText;
    bool _triggerTextChangedforAmountEntry = true;
    protected override async void OnCreate(Bundle savedInstanceState)
        {

            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.transferscreen2);
        _nextButton = FindViewById<Button>(Resource.Id.btnNext);

            _amountEditText = FindViewById<EditText>(Resource.Id.etTransactionAmount);
            _amountEditText.SetSelection(_amountEditText.Text.Length);

            _amountEditText.TextChanged += _amountEditText_TextChanged;

            _amountEditText.SetOnTouchListener(this);
    }

    private void _amountEditText_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
        {
            if (_triggerTextChangedforAmountEntry)
            {
                _triggerTextChangedforAmountEntry = false;
                string pressedKey = "";
                if (e.Text.Count() < (e.Start + 1))
                {
                    pressedKey = "";
                }
                else
                {
                    pressedKey = e.Text.ToString()[e.Start].ToString();
                }


                if (!string.IsNullOrEmpty(pressedKey))
                {
                    CalculateAmountAfterKeyPress(pressedKey, e.Start);

                }
                else
                {
                    CalculateAmountAfterKeyPress("←", 0);
                }

                _amountEditText.SetSelection(_amountEditText.Text.Length);
                _triggerTextChangedforAmountEntry = true;
            }
        }

    private void CalculateAmountAfterKeyPress(string key, int cursorPosition) //appending method.
        {
            string currentText = "";
            if (key == "←")
            {
                currentText = _amountEditText.Text.Trim().Replace("$", "");
            }
            else
            {
                currentText = _amountEditText.Text.Trim().Remove(cursorPosition, 1).Replace("$", "");
            }

            string result = "0";
            bool isProperValue = false;
            switch (key)
            {
                case "0":
                case "1":
                case "2":
                case "3":
                case "4":
                case "5":
                case "6":
                case "7":
                case "8":
                case "9":
                    isProperValue = Common.ShiftLeftandAppendChar(currentText, key, out result);

                    break;
                case "←":
                    isProperValue = Common.ShiftRight(currentText, out result);
                    break;
                case "C":
                    isProperValue = true;
                    result = "0.00";
                    break;
                default:
                    isProperValue = true;
                    break;
            }

            _amountEditText.Text = Resources.GetString(Resource.String.CurrencySymbol) + result;
            if (!isProperValue)
            {
                Common.ShakeAnimation(this, _amountEditText);
            }
        }

    public bool OnTouch(View v, MotionEvent e)
        {
            _amountEditText.OnTouchEvent(e);
            _amountEditText.SetSelection(_amountEditText.Text.Length);
            return true;
        }
}

我的问题是..我想在 Xamarin.ios 中复制整个内容..我对这个 xamarin.ios 很陌生。谁能指导我 实现这一目标。请让我知道是否有其他解决方法可以做到这一点。

这里是 xamarin.ios 代码(不完整)

namespace MobileApplication.iOS
{
    public partial class FundTransferScreenController : BaseViewController
        {
        public FundTransferScreenController(IntPtr handle) : base(handle)
            {
             }

            public override async void ViewDidLoad()
            {
                    base.ViewDidLoad();
            amountValue.ValueChanged += HandleTextChanged; 

                }

        }

        private void HandleTextChanged(object sender, EventArgs e)
        {
            //how to do it like android code..?
        }
    public override void TouchesBegan(NSSet touches, UIEvent evt)
        {
            base.TouchesBegan(touches, evt);
            amountValue.ResignFirstResponder();
        }
}

【问题讨论】:

    标签: c# android xamarin xamarin.ios xamarin.android


    【解决方案1】:

    您可以很容易地实现这一点,尽管它在 iOS 中的包装方式有所不同。用委托处理它,而不是 EventHandlers

    在控制器中将 TextField 的委托设置为 this

    field.Delegate = this;
    

    确保您的控制器实现IUITextFieldDelegate

    然后实现以下方法:

        [Export("textField:shouldChangeCharactersInRange:replacementString:")]
        public bool ShouldChangeCharacters(UITextField textField, NSRange range, string replacementString)
        {
            return true;
        }
    

    每次文本变化时都会调用,也可以从函数中获取值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2015-03-12
      • 2011-12-24
      相关资源
      最近更新 更多