I am trying to find work with Android issue with zero length formatting. I realized, well, I’ll just remove the Spans that will become zero length. After looking around a bit, I realized that SpanWatcher would be a good way to do this. However, there seem to be no examples of how to implement or add SpanWatchers.
I tried this in MonoDroid:
public class PreventZeroLenSpan : Java.Lang.Object, ISpanWatcher
{
void ISpanWatcher.OnSpanAdded (ISpannable text, Java.Lang.Object what, int start, int end)
{
if (what==this) return;
var CS = what as Android.Text.Style.CharacterStyle;
if (CS==null) return;
if (start==end) text.RemoveSpan(CS);
}
void ISpanWatcher.OnSpanChanged (ISpannable text, Java.Lang.Object what, int ostart, int oend, int nstart, int nend)
{
if (what==this) return;
var CS = what as Android.Text.Style.CharacterStyle;
if (CS==null) return;
if (nstart==nend) text.RemoveSpan(CS);
}
void ISpanWatcher.OnSpanRemoved (ISpannable text, Java.Lang.Object what, int start, int end)
{
}
}
And events are raised if I add them directly to SpannableStringBuilder or SpannableString before anything else, but after it goes into the EditText control, it no longer responds.
var Str = new SpannableStringBuilder("Test IT");
var Sty = new ForegroundColorSpan(Android.Graphics.Color.Blue);
Str.SetSpan(SpanWatch,0,Str.Length(), SpanTypes.InclusiveInclusive);
Str.SetSpan(Sty,5,7, SpanTypes.InclusiveInclusive);
txEdit.SetText(Str, TextView.BufferType.Editable);
SpanWatcher implements NoCopySpan, so it is not copied to EditText. I cannot find any methods for adding SpanWatcher directly to EditText (there is a way to add TextWatcher).
, SpanWatcher, . . ( .)
, Java MonoDroid .
, SpanWatcher ( ), , Span , EditText.AddTextChangedListener() TextWatcher:
public class PreventZeroLenSpanWatcher : Java.Lang.Object, ITextWatcher
{
void ITextWatcher.AfterTextChanged (IEditable s)
{
var Objs = s.GetSpans(0,s.Length(), Java.Lang.Class.FromType(typeof(Android.Text.Style.CharacterStyle)));
foreach (Android.Text.Style.CharacterStyle CS in Objs)
{
int Start = s.GetSpanStart(CS);
int End = s.GetSpanEnd(CS);
if (Start == End) s.RemoveSpan(CS);
}
}
void ITextWatcher.BeforeTextChanged (Java.Lang.ICharSequence s, int start, int count, int after)
{
}
void ITextWatcher.OnTextChanged (Java.Lang.ICharSequence s, int start, int before, int count)
{
}
}
EDIT2
, SpanWatcher EditText, , , , . - , , SpanWatcher .
IEditable txEditFormatted = ((IEditable)txEdit.TextFormatted);
txEditFormatted.SetSpan(SpanWatch,0,txEditFormatted.Length(), SpanTypes.InclusiveInclusive);
TextWatcher SpanWatcher, .