如何在onTextChanged()中使用setSpan()来保存onTextChanged()的参数?

时间:2014-10-15 23:40:58

标签: android android-edittext textwatcher spannablestring

我实际上是在尝试进行卡片格式化,因为我正试图实现谷歌所说的link

  

您不会被告知发生了更改的位置,因为其他afterTextChanged()方法可能已经进行了其他更改并使偏移无效。但是如果您需要在这里知道,可以在onTextChanged(CharSequence,int,int,int)中使用setSpan(Object,int,int,int)来标记您的位置,然后从这里查找跨度最终的位置。

从上面我所理解的是我需要在onTextChanged()中使用setSpan保存[CharSequence s,int start,int before,int count]并以某种方式在afterTextChanged()中检索它们。

问题是,在onTextChanged()中我在哪个对象上调用setSpan(),如何在afterTextChanged()中检索这些保存的值。

1 个答案:

答案 0 :(得分:4)

所以我想出了这个。下面是一个准确的例子,可以作为起点。

import android.text.Editable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextWatcher;
import android.text.style.RelativeSizeSpan;

public class AwesomeTextWatcherDeluxe implements TextWatcher {

    private RelativeSizeSpan span;
    private SpannableString spannable;


    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // We can use any span here. I use RelativeSizeSpan with size 1, which makes absolutely nothing.
        // Perhaps there are other spans better suited for it?
        span = new RelativeSizeSpan(1.0f);
        spannable = new SpannableString(s);
        spannable.setSpan(span, start, start + count, Spanned.SPAN_COMPOSING);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        int beginIndex = spannable.getSpanStart(span);
        int endIndex = spannable.getSpanEnd(span);

        // Do your changes here.

        // Cleanup
        spannable.removeSpan(span);
        span = null;
        spannable = null;
    }
}