System.InvalidCastException:指定的强制转换在editText.AddTextChangedListener

时间:2017-02-10 18:23:55

标签: android xamarin android-edittext xamarin.android

当我尝试使用单独的类重用货币格式的格式时,会生成错误。

主要例程:

using Android.App;
using Android.OS;
using Android.Widget;

namespace TextWatcher
{
    [Activity(Label = "Main2", MainLauncher = true)]
    public class Main_Activity1 : Activity
    {
        private EditText editText;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Main);

            editText = FindViewById<EditText>(Resource.Id.editText);
            var watch = new CurrencyTextWatcher(editText);

            editText.AddTextChangedListener(watch);


        }
    }
}

执行格式化的类(Better way to Format Currency Input editText?

using Android.Widget;
using Android.Text;
using Java.Lang;
using System;
using Java.Text;
using Java.Util;
using System.Text.RegularExpressions;

namespace TextWatcher
{

    public class CurrencyTextWatcher : ITextWatcher
    {
        private EditText editText;
        private string lastAmount = "";
        private int lastCursorPosition = -1;

        public CurrencyTextWatcher(EditText txt)
        {
            this.editText = txt;
        }

        public IntPtr Handle
        {
            get
            {
                throw new NotImplementedException();
            }
        }

        public void AfterTextChanged(IEditable s)
        {

        }

        public void BeforeTextChanged(ICharSequence amount, int start, int count, int after)
        {
            string value = amount.ToString();
            if (!value.Equals(""))
            {
                string cleanString = clearCurrencyToNumber(value);
                string formattedAmount = transformtocurrency(cleanString);
                lastAmount = formattedAmount;
                lastCursorPosition = editText.SelectionStart;
            }
        }

        public void OnTextChanged(ICharSequence amount, int start, int before, int count)
        {
            if (!amount.ToString().Equals(lastAmount))
            {
                string cleanString = clearCurrencyToNumber(amount.ToString());
                try
                {
                    string formattedAmount = transformtocurrency(cleanString);
                    editText.RemoveTextChangedListener(this);
                    editText.Text = formattedAmount;
                    editText.SetSelection(formattedAmount.Length);
                    editText.AddTextChangedListener(this);

                    if (lastCursorPosition != lastAmount.Length && lastCursorPosition != -1)
                    {
                        int lengthDelta = formattedAmount.Length - lastAmount.Length;
                        int newCursorOffset = Java.Lang.Math.Max(0, Java.Lang.Math.Min(formattedAmount.Length, lastCursorPosition + lengthDelta));
                        editText.SetSelection(newCursorOffset);
                    }
                }
                catch (System.Exception e)
                {
                    //log something
                }
            }
        }

        public static string clearCurrencyToNumber(string currencyValue)
        {
            string result = "";

            if (currencyValue == null)
            {
                result = "";
            }
            else
            {
                result = Regex.Replace(currencyValue, "[^0-9]", "");
            }
            return result;
        }

        public static string transformtocurrency(string value)
        {
            double parsed = double.Parse(value);
            string formatted = NumberFormat.GetCurrencyInstance(new Locale("pt", "br")).Format((parsed / 100));
            formatted = formatted.Replace("[^(0-9)(.,)]", "");
            return formatted;
        }

        public static bool isCurrencyValue(string currencyValue, bool podeSerZero)
        {
            bool result;

            if (currencyValue == null || currencyValue.Length == 0)
            {
                result = false;
            }
            else
            {
                if (!podeSerZero && currencyValue.Equals("0,00"))
                {
                    result = false;
                }
                else
                {
                    result = true;
                }
            }
            return result;
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }
    }
}

执行代码后,会发生错误,请参见下图:

System.InvalidCastException: Specified cast is not valid on editText.AddTextChangedListener

帮助!

1 个答案:

答案 0 :(得分:1)

您的TextWatcher实现需要从Java.Lang.Object继承,以便创建Android Callable Wrappers(ACW),以便此对象可以跨越在Java和。之间。网络虚拟机。

参考:Android Callable Wrappers

由于您要创建一个独立的观察程序,请从当前的实施中删除DisposeHandle(如果需要,您需要覆盖来替换{ {1}})

即:

Java.Lang.Object

现在您可以实例化并将其指定为文本观察者监听器: