setSpan () удалил другие пролеты в Android lollipop API 21 - PullRequest
0 голосов
/ 29 июня 2019

Как и в этом вопросе , у меня есть кнопка жирного шрифта, при нажатии на нее включается жирный стиль при наборе EditText, а при повторном нажатии отключает стиль жирного шрифта.

На Android API 26 и 24 работает нормально:

"regularText Boldtext regularTextAgain"

в приведенном выше примере, после ввода «normalText» я нажал кнопку «полужирный» и набрал «Boldtext», а после Boldtext я снова нажал и набрал «normalTextAgain»

обратите внимание, что между словами нет пробелов.

В API 21 он ведет себя не так:

при нажатии кнопки полужирного шрифта для отключения стиля после ввода «normalText Boldtext », следующие символы не будут выделены жирным шрифтом, но также полужирный стиль на BoldText исчез!

вот мой TextWatcher:

class RichTextWatcher implements android.text.TextWatcher {
    private int mStartPos;
    private int mEndPos;

    RichTextWatcher() {
        mStartPos = 0;
        mEndPos = 0;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        mStartPos = start + count;
        mEndPos = start + count + 1;
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        if (mStyleListener == null) {
            Log.e("RichTextWatcher", "style listener is null");
            return;
        }
        for (MarkdownStyleSpan styleSpan : mStyleListener.getActiveStyles()) {
            styleSpan.getStylePainter().applyStyle(s, mStartPos, mEndPos);
        }
    }
}

Вот как я применяю жирный стиль:

public class BoldStylePainter implements IStylePainter {
    private int mStartPos = -1;

    @Override
    // called when enabling the bold style
    public void applyStyle(@NonNull Editable s, int start, int end) {
        if (end > s.length() || start < 0) {
            return;
        }
        mStartPos = mStartPos < 0 ? start : mStartPos;
        if (end >= mStartPos) {
            s.setSpan(getBoldSpan(), mStartPos, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    @Override
    // called when disabling the bold style
    public void removeStyle(@NonNull Editable s, int start, int end) {
        mStartPos = -1;
    }

    private StyleSpan getBoldSpan() {
        return new StyleSpan(Typeface.BOLD);
    }
}

Я не понимаю этого поведения, тем более что тот же код работает, как и ожидалось, для API 24 и 26. Есть идеи, что происходит?

Примечание для API 21 в beforeTextChanged(...) и onTextChanged(...) индекс start всегда равен нулю, если только не нажать пробел, но у count есть индекс, поэтому мне пришлось сделать расчет значений начала и конца, совпадающих во всех API.

...