Как и в этом вопросе , у меня есть кнопка жирного шрифта, при нажатии на нее включается жирный стиль при наборе 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.