如何在 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使用

UpdatePanel OnTextChanged 中的 ASP.NET TextBox 不会触发

如何在 KeyUp 上进行文本框回发?

智能提示文本框输入的字符长度 asp.net中如何实现。