我在Android中使用了自定义条目渲染器,并且我已经实现了BeforeTextChanged事件,这样我就可以获得要输入的文本,但它不会返回该文本。
我以两种不同的方式实施:
首先通过类实现ITextWatcher然后重写上述事件(帮助link):
void ITextWatcher.BeforeTextChanged(ICharSequence s, int start, int count, int after)
{
var test1 = new string(s?.ToArray());
var test2 = Control?.Text;
SpannableString spannableString = new SpannableString(s);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.Blue);
spannableString.SetSpan(backgroundSpan, start, start + count,
SpanTypes.ExclusiveExclusive);
var test3 = spannableString;
}
第二种方式:
Control.BeforeTextChanged += (sender, args) =>
{
var test1 = new string(args?.Text.ToArray());
var entry = sender as EditText;
var test2 = entry?.Text;
var test3 = Control?.Text;
};
但是他们都不会返回即将输入的文本。 我想要的是访问该文本,并且仅在某些情况下允许插入该文本。 我不想使用行为,因为它不适合我的需要。
答案 0 :(得分:0)
第一种方式,ITextWatcher
:
class MyEntryRenderer : EntryRenderer
{
public MyEntryRenderer() : base()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.SetBackgroundColor(global::Android.Graphics.Color.LightGreen);
Control.AddTextChangedListener(new MyTextWatcher());
}
}
}
class MyTextWatcher :Java.Lang.Object, ITextWatcher
{
public void AfterTextChanged(IEditable s)
{
Android.Util.Log.Error("lv", "afterTextChanged ---->" + s);
}
public void BeforeTextChanged(ICharSequence s, int start, int count, int after)
{
Android.Util.Log.Error("lv", "beforeTextChanged ----> s=" + s + "----start=" + start
+ "----after=" + after + "----count" + count);
}
public void OnTextChanged(ICharSequence s, int start, int before, int count)
{
Android.Util.Log.Error("lv", "onTextChanged ---->s=" + s + "----start=" + start
+ "----before=" + before + "----count" + count);
}
}
效果很好。
第二种方式,Control.BeforeTextChanged
,它也运作良好。
它没有返回该文本
您在问题中提供的方法,它们在我的手机中都运行良好。请显示更多代码,以便我帮助您找到错误的地方。