当我尝试使用单独的类重用货币格式的格式时,会生成错误。
主要例程:
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 :(得分:1)
您的TextWatcher实现需要从Java.Lang.Object
继承,以便创建Android Callable Wrappers(ACW
),以便此对象可以跨越在Java和。之间。网络虚拟机。
由于您要创建一个独立的观察程序,请从当前的实施中删除Dispose
和Handle
(如果需要,您需要覆盖来替换{ {1}})
即:
Java.Lang.Object
现在您可以实例化并将其指定为文本观察者监听器: