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, я проверил это. Вы можете соединить эти два диапазона с одним классом и использовать его с другими цветами.

Другие вопросы по тегам