Как да използвам setSpan() в onTextChanged() за запазване на параметрите на onTextChanged()?

Всъщност се опитвам да направя форматиране на карти, за това се опитвам да внедря това, което google казва от връзка

Не ви се казва къде е извършена промяната, защото други методи afterTextChanged() може вече да са направили други промени и да са обезсилили отместванията. Но ако трябва да знаете тук, можете да използвате setSpan(Object, int, int, int) в onTextChanged(CharSequence, int, int, int), за да маркирате вашето място и след това да погледнете оттук нагоре, където е приключил диапазонът.

От горе разбирам, че трябва да запазя [CharSequence s, int start, int преди, int count] с помощта на setSpan в onTextChanged() и по някакъв начин да ги извлека обратно в afterTextChanged().

Въпросът е на кой обект да извикам setSpan() в onTextChanged() и как да извлека тези запазени стойности в afterTextChanged().


person T_C    schedule 15.10.2014    source източник
comment
Чудя се същото, за почти идентичен случай на употреба. Разбрахте ли някога това?   -  person MW.    schedule 21.04.2015


Отговори (1)


Така че разбрах това. По-долу е пример за barebones, който може да се използва като отправна точка.

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;
    }
}
person MW.    schedule 21.04.2015
comment
Уау, това изглежда ужасяващо. Аз също доста се забърквах с него и открих, че всъщност можете да прехвърлите CharSequence към Spannable, тъй като в повечето случаи параметърът s е подклас, който имплементира Spannable като span обект, можете да използвате самия TextWatcher (подайте това). - person kravitz; 28.01.2018
comment
Работи! Също така използвайки обикновен Object, създаден само веднъж, вместо RelativeSizeSpan, и използвайки 0 като флагове за setSpan(). private Object span = new Object(); ...; spannable.setSpan(span, start, start + count, 0); - person PJ_Finnegan; 09.07.2020