TextView с ImageSpan искажает высоту строки

У меня есть TextView, заполненный текстом, который должен содержать несколько объектов ImageSpan. Изображения могут быть выше обычной высоты строки, что вызывает следующую проблему:

  • если изображение является последним объектом строки, высота следующих строк верна
  • если последний объект не является изображением, высота следующих строк устанавливается равной высоте строки, содержащей изображение

Вот правильная ситуация: введите здесь описание изображения


Это неправильная ситуация: введите здесь описание изображения

Что более интересно, так это то, что если в тексте есть символ новой строки, высота строки с этого момента снова хорошая.

TextView довольно простой:

<TextView
    android:id="@+id/text_02"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="18dp"
    android:text="Text 02" />

(TextView находится в LinearLayout, который находится в ScrollView.)

Вот как я создаю составной текст:

TextView textView02 = (TextView) findViewById(R.id.text_02);

SpannableString string = new SpannableString(LOREM_IPSUM);
string.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), 102, 103, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
string.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), 105, 106, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
string.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), 108, 109, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

textView02.setText(string);

Есть ли у кого-нибудь идеи о решении для этого? Я бы предпочел не переопределять методы рисования линий TextView...


person Gergely Kőrössy    schedule 27.09.2016    source источник
comment
ты когда-нибудь понял это   -  person j2emanue    schedule 30.03.2017
comment
Не настоящий. Тем не менее, я тестировал его с несколькими изображениями эмулятора, и мне кажется, что это дает только API 23 (6.0). Кроме того, если бы я запустил его на телефоне с API 23 (я думаю, 6.0.2), он бы никогда не показал такого поведения. Я думаю, что разработчики что-то напутали в оригинальном API 23, но потом исправили.   -  person Gergely Kőrössy    schedule 30.03.2017
comment
@ GergelyKőrössy ты нашел решение на данный момент? Есть ли обходной путь для API 23?   -  person Den    schedule 19.10.2018


Ответы (1)


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

Drawable vegetary = mContext.getResources().getDrawable(R.drawable.ic_best_veget);
    vegetary.setBounds(0, 0, vegetary.getIntrinsicWidth(), <yourHeight>);
    ssb.setSpan(new ImageSpan(vegetary, ImageSpan.ALIGN_BASELINE), ssb.length()-1, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
person jennymo    schedule 26.04.2017