Android - Удалить весь ImageSpan, когда его часть удалена?
Я добавляю изображение в мой текст редактирования, вставляя ImageSpan. У меня нет полного понимания диапазонов, но мне кажется, что мой ImageSpan должен обернуть часть текста. Поэтому я добавляю текст в EditText и оборачиваю его своим ImageSpan, и он выглядит нормально. Однако, когда я возвращаю ImageSpan, он удаляет только один символ текста, и изображение остается до тех пор, пока весь текст не будет удален. Как мне заставить его просто удалить с одним backspace?
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(content.getText());
String imgId = "[some useful text]";
int selStart = content.getSelectionStart();
builder.replace(content.getSelectionStart(), content.getSelectionEnd(), imgId);
builder.setSpan(imageSpan, selStart, selStart+imgId.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
content.setText(builder);
3 ответа
Через некоторое время я нашел решение. Попробуйте этот код:
private TextWatcher watcher = new TextWatcher() {
private int spanLength = -1;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (start == 0) return;
if (count > after) {
ImageSpan[] spans = getEditableText().getSpans(start + count, start + count, ImageSpan.class);
if (spans == null || spans.length == 0) return;
for (int i = 0; i < spans.length; i++) {
int end = getEditableText().getSpanEnd(spans[i]);
if (end != start + count) continue;
String text = spans[i].getSource();
spanLength = text.length() - 1;
getEditableText().removeSpan(spans[i]);
}
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (spanLength > -1) {
int length = spanLength;
spanLength = -1;
getEditableText().replace(start - length, start, "");
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
Но вы должны создать ImageStan с оригинальной строкой следующим образом:
ssb.setSpan(new ImageSpan(bmpDrawable, originalStr), x, x + originalStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Вот мой удар:
field.doBeforeTextChanged { text, start, count, _ ->
val spans = toField.text.getSpans<ImageSpan>(start = start + 1, end = start + 1 + count)
for (span in spans) {
toField.text.removeSpan(span)
}
}
Не забудьте заменить ImageSpan
с тем, который вас интересует.
Приведенные выше ответы полезны. Но будьте осторожны, чтобы:
imagespan.source
используется для сохранения информации об uri изображения при его построении! когда вы используете
ImageSpan
,
mSource
дается строковое значение доступного ресурса, связанного с его
uri
Используйте c
ontentDescription
вместо этого в Api30 и выше