如何在 onTextChanged() 中使用 setSpan() 来保存 onTextChanged() 的参数?
Posted
技术标签:
【中文标题】如何在 onTextChanged() 中使用 setSpan() 来保存 onTextChanged() 的参数?【英文标题】:How to use setSpan() in onTextChanged() to save parameters of onTextChanged()? 【发布时间】:2014-12-11 04:51:16 【问题描述】:我实际上是在尝试进行卡片格式化,因为我正在尝试实现谷歌在link 中所说的内容
您不会被告知更改发生的位置,因为其他 afterTextChanged() 方法可能已经进行了其他更改并使偏移量无效。但是如果你需要知道这里,你可以使用 onTextChanged(CharSequence, int, int, int) 中的 setSpan(Object, int, int, int) 来标记你的位置,然后从这里查找 span 结束的位置。
据我了解,我需要在 onTextChanged() 中使用 setSpan 保存 [CharSequence s, int start, int before, int count] 并以某种方式在 afterTextChanged() 中检索它们。
问题是,我在 onTextChanged() 中对哪个对象调用 setSpan() 以及如何在 afterTextChanged() 中检索这些保存的值。
【问题讨论】:
我想知道同样的事情,对于一个几乎相同的用例。你有想过这个吗? 【参考方案1】:所以我想出了这个。下面是一个可以作为起点的准系统示例。
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;
【讨论】:
哇,这看起来很可怕。我也有点搞砸了,发现你基本上可以将 CharSequence 转换为 Spannable,因为在大多数情况下,参数 s 是一个子类,它将 Spannable 实现为一个跨度对象,你可以使用 TextWatcher 本身(传递它)。跨度> 有效!还使用一个普通的Object
,只创建一次,而不是RelativeSizeSpan
,并使用0 作为setSpan()
的标志。 private Object span = new Object(); ...; spannable.setSpan(span, start, start + count, 0);
以上是关于如何在 onTextChanged() 中使用 setSpan() 来保存 onTextChanged() 的参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个创建 onTextChanged Listener 并允许程序员设置不同行为的类
Android:OnTextChanged 电子邮件验证未按预期工作
安卓onTextChanged参数解释及实现EditText字数监听 Editable使用