Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在onTextChanged()中使用setSpan()保存onTextChanged()的参数?_Android_Android Edittext_Textwatcher_Spannablestring - Fatal编程技术网

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

Android 如何在onTextChanged()中使用setSpan()保存onTextChanged()的参数?,android,android-edittext,textwatcher,spannablestring,Android,Android Edittext,Textwatcher,Spannablestring,我实际上是在尝试卡片格式化,因为我正试图实现谷歌从 您不会被告知更改发生在何处,因为其他afterTextChanged()方法可能已经进行了其他更改并使偏移无效。但是如果您需要知道这里,您可以在onTextChanged(CharSequence,int,int,int)中使用setSpan(Object,int,int,int)来标记您的位置,然后从这里查找跨度结束的位置 从上面我了解到的是,我需要在onTextChanged()中使用setSpan保存[CharSequence s,int

我实际上是在尝试卡片格式化,因为我正试图实现谷歌从

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

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


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

所以我想出了这个方法。下面是一个可以作为起点的简单示例

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 s转换为Spanable,因为在大多数情况下,参数s是一个子类,它将Spanable实现为一个span对象,您可以使用TextWatcher本身(传递这个)。它可以工作!还使用一个只创建一次的普通
对象,而不是
相对性span
,并使用0作为
设置span()的标志<代码>私有对象span=新对象()。。。;spannable.setSpan(范围,开始,开始+计数,0)