2014-02-20 2 views
3

Я динамически заполняю многострочный TextView с элементами. Строка введенных элементов обертывается. Каждый элемент состоит из двух частей: текста, за которым следует изображение. Длина изображения - 2 символа. Элементы разделены пробелом. Для добавления элементов я использую SpannableStringBuilder. Все работает отлично, за исключением одного. Добавляя новый элемент, который переходит к следующей строке (TextView обертывает строку), изображение предыдущего элемента, которое является последним в строке выше, исчезает, независимо от того, сколько места по-прежнему доступно в этой строке. И если я удалю недавно добавленный элемент в новой строке, это изображение снова появится снова. Таким образом, часть изображения каждого элемента, которая является последней в каждой строке, не отображается. Я использую Android 4.0.3.Wrappable TextView с SpannableStringBuilder и ImageSpan скрывает последнее изображение на каждой строке

Вот мой код:

TextView textView = (TextView) findViewById(R.id.textview); 
textView.setMovementMethod(new ScrollingMovementMethod()); 

SpannableStringBuilder ssb = new SpannableStringBuilder(); 

//then for each new element I do the following 
ssb.append(" "); //space separating elements (skip for the first element) 
ssb.append("text"); 
Bitmap image = BitmapFactory.decodeResource(getResources(), imageId); 
ssb.append(" "); //prepare 2-character space for the image 
ssb.setSpan(new ImageSpan(image), ssb.length() - 2, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //put the image to the prepared space 
textView.setText(ssb, BufferType.SPANNABLE); 

Я знаю, что есть решение с TextWatcher. В то же время, я не вижу потоков в своем коде и не могу понять, почему последнее изображение на каждой строке скрывается. Любые предложения будут высоко оценены. Благодарю.

+1

Так вы могли бы решить эту проблему? У меня такая же проблема. Пожалуйста, поделитесь своим решением. –

+0

Мне хотелось бы услышать решение для этого, у меня такая же проблема. – Camputer

+0

@ 4aRkKn1gh7 Проверьте [мой ответ ниже] (http://stackoverflow.com/a/33282500/4899346). –

ответ

7

Я нашел решение. Проблема заключается в способе вычисления текстовых строк. Если строка заканчивается символом пробела, это пространство во время вычислений опускается. Итак, все, что вам нужно сделать, это использовать любую букву в качестве заполнителя для ваших изображений. Как это:

ssb.append(" i"); //prepare 2-characters for the image 

PS: Я не знаю, почему вы используете 2 символов строки для каждого изображения, но я должен сказать, что вы можете использовать только один символ. Ниже приводится более эффективный код:

int start = ssb.length(); 
ssb.append('i'); 
ssb.setSpan(new ImageSpan(image), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
+1

Это полностью помогло мне, спасибо большое! – jds17

+0

Решил! Благодаря! – Harry

Смежные вопросы