В StyleSpan, почему Typeface to NORMAL нельзя применять поверх Typeface to BOLD?

Button btnBold = (Button) findViewById(R.id.btnBold);
    btnBold.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick (View v){
        startSelection = etx.getSelectionStart();
        endSelection = etx.getSelectionEnd();


        Spannable s = etx.getText();
        s.setSpan(new StyleSpan(Typeface.BOLD), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
});


Button btnNormal = (Button) findViewById(R.id.btnNormal);
    btnNormal.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick (View v){
        startSelection = etx.getSelectionStart();
        endSelection = etx.getSelectionEnd();
        Spannable s = etx.getText();
        s.setSpan(new StyleSpan(Typeface.NORMAL), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
});

С помощью приведенного выше кода я пытаюсь выделить BOLD и UNBOLD выделенный текст с кнопки.

Например: Я выделил эту строку жирным шрифтом, выбрав все сразу.

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

Я уже прошел через эти ответы, но не повезло:

Как выделить выделенный текст в Edittext Android?

Удалить стиль для промежутков

Удаление стиля из выделенного текста в тексте редактирования

Проблема с приведенными выше решениями заключается в том, что, например, если вы выбрали пять слов из текста и выделили их жирным шрифтом, а теперь вы выделили некоторую часть этого текста жирным шрифтом и выделили его жирным шрифтом, тогда все пять слов будут выделены жирным шрифтом.

Решения, упомянутые в приведенных выше ссылках, используют следующий код для удаления диапазона, который не решает проблему правильно.

Spannable str = this.getText();
StyleSpan[] spans = str.getSpans(sStart, sEnd, StyleSpan.class);
for (int i = 0; i < spans.length; i++) {
    if (spans[i].getStyle() == android.graphics.Typeface.BOLD){
        str.removeSpan(spans[i]);
    }
}

Я не могу найти Android API, где я могу удалить диапазон из выбранного диапазона. Любая помощь приветствуется, спасибо.


person ExtendedScope    schedule 20.03.2019    source источник