在我的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();
}
}
答案 0 :(得分:0)
你很容易实现这一点,尽管它在iOS中的包装方式不同。使用代理处理它,而不是使用EventHandlers
在控制器中将TextField的委托设置为this
:
field.Delegate = this;
确保您的控制器实现IUITextFieldDelegate
然后实现以下方法:
[Export("textField:shouldChangeCharactersInRange:replacementString:")]
public bool ShouldChangeCharacters(UITextField textField, NSRange range, string replacementString)
{
return true;
}
每次文本更改时都会调用它,您也可以从函数中获取值。