How to use SpanWatcher in Android?

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)
    {
        // nothing
    }
}

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)
    {
        // nothing
    }

    void ITextWatcher.OnTextChanged (Java.Lang.ICharSequence s, int start, int before, int count)
    {
        // nothing
    }
}

EDIT2

, SpanWatcher EditText, , , , . - , , SpanWatcher .

        IEditable txEditFormatted = ((IEditable)txEdit.TextFormatted);
        txEditFormatted.SetSpan(SpanWatch,0,txEditFormatted.Length(), SpanTypes.InclusiveInclusive);

TextWatcher SpanWatcher, .

+5

All Articles