2017-02-10 29 views
1

当我尝试使用单独的类重用货币格式的格式时,会生成错误。System.InvalidCastException:指定的转换在editText.AddTextChangedListener上无效

主程序:

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

帮助!

+0

指定您得到这些异常的行。 –

+0

什么行号码失败?在logcat中单击由蓝色(文本显示为红色)下划线的错误 – Tasos

回答

0

你TextWatcher的实现需要从Java.Lang.Object为了继承一个Android调用包装(ACW)要创建这样这个对象可以跨越Java和.Net虚拟机之间

编号:Android Callable Wrappers

因为要创建一个独立的观察者,删除Dispose并从当前实现Handle(如果需要的话,您将需要覆盖他们为Java.Lang.Object的那些)

即:

public class CurrencyTextWatcher : 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) 
    { 
     //~~~~ 
    } 
} 

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

+0

Tks Suchi!有效! –

相关问题