我实际上是在尝试进行卡片格式化,因为我正试图实现谷歌所说的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()中检索这些保存的值。
答案 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;
}
}