Android Spannable: копировать / вырезать пользовательский Span только в Edittext Вставить базовый класс
Я пытаюсь расширить некоторые диапазоны, чтобы они могли стать составными (чтобы избежать необходимости устанавливать несколько интервалов для одного фрагмента текста) и / или хранить больше информации о себе (например, "types" и "id" и т. Д.)
Все работает, как и ожидалось, пока я не скопировал / вырезал, а затем вставил текст. После операции вставки пользовательские диапазоны теряют все настройки, остается только стиль, специфичный для базового диапазона.
Например, если я продлю BackgroundColorSpan
чтобы всегда применять красный цвет текста, это будет работать. Установка ниже Extended BackgroundColorSpan
для любого текста будет правильно задан фон, а текст будет красным, по желанию. Вот код для промежутка:
public class ExtendedBackgoundColorSpan extends BackgroundColorSpan {
private final int fgColor = Color.parseColor("#FF0000");
public ExtendedBackgoundColorSpan(int color) {
super(color);
}
public ExtendedBackgoundColorSpan(Parcel src) {
super(src);
}
/*Make text colour red*/
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(fgColor);
}
}
Все в порядке, пока я не скопировал / вырезал, а затем вставил составной текст. Затем он потеряет свою "красноту", но сохранит цвет фона. Кроме того, вставленный интервал распознается как простой BackgroundColorSpan
, и не ExtendedBackgroundColorSpan
,
Пробовал переопределение writeToParcel(Parcel dest, int flags)
из базового класса, с настраиваемым (не финальным) fgColor
также (установив его конструктор), но ничего не получалось.
Я также испытываю такое поведение, когда пытаюсь создать пользовательские пролеты с дополнительной информацией (например, специальным тегом или идентификатором). Дополнительная информация и даже расширенный тип диапазона теряются при вставке.
Что мне не хватает?
Изменить: это то, что мне не хватало. Следующее от Android разработчиков ClipData.Item
здесь:
Описание одного элемента в ClipData.
Типы, которые могут содержать отдельные элементы:
- Текст: основная строка текста. На самом деле это CharSequence, поэтому он может быть отформатирован и поддерживается соответствующим диапазоном встроенных стилей Android. (Пользовательские диапазоны приложений не поддерживаются и будут удалены при переносе через буфер обмена.)
(Акцент мой.)
Я оставлю принятый ответ принятым, поскольку именно это указало мне правильное направление.
<rant>
(То есть смотреть на то, что я, возможно, не смогу сделать, потому что кто-то из команды Android решил, что я не должен. EditText
с пользовательской логикой вставки и обратными вызовами для действий копирования / вырезания / вставки, просто для того, чтобы реализовать что-то, что должно быть задачей ОС в первую очередь. Вся платформа выглядит как массивный взлом.) </rant>
1 ответ
Вы вдохновили меня на веселье с spannables. Нет возможности продлить BackgroundColorSpan
и реализовать собственный ParcelableSpan
"S. Framework не позволяет этого, проверьте это по ссылке ParcelableSpan. В противном случае я попытался решить вашу проблему, и ответ прост:
SpannableString spannableString = new SpannableString(firstEditText.getText().toString());
spannableString.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spannableString.length(), 0);
spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString.length(), 0);
Строка может быть скопирована и вставлена перед установкой span, я проверил это. Вы можете соединить эти два диапазона с одним классом и использовать его с другими цветами.