Странная проблема с android:ellipsize=end

Я использую android:ellipsize="end" в файле android xml, и, что удивительно, я не получаю макет, который хочу, отображаются 3 точки (...), но после этих точек есть еще одно слово усечено. Также это «не всегда» поведение, проверьте прикрепленный ListView, иногда поведение нормальное, а иногда нет.

Вот скриншот раскладки с моего устройства,

введите здесь описание изображения

Я понятия не имею, почему это происходит. Вот мой xml-файл, проблема с tv_news_content TextView -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@color/white" >

<ImageView
    android:id="@+id/iv_next_tier"
    android:layout_width="18dp"
    android:layout_height="21dp"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="10dp"
    android:src="@drawable/right_arrow" >
</ImageView>

<TextView
    android:id="@+id/tv_news_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="7dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="3dp"
    android:layout_toLeftOf="@+id/iv_next_tier"
    android:ellipsize="end"
    android:maxLines="2"
    android:text="News Title"
    android:textColor="@color/black"
    android:textSize="17dp"
    android:textStyle="bold" />

<TextView
    android:id="@+id/tv_news_content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/tv_news_title"
    android:layout_below="@+id/tv_news_title"
    android:layout_marginRight="5dp"
    android:layout_toLeftOf="@+id/iv_next_tier"
    android:ellipsize="end"
    android:maxLines="2"
    android:text="News Contents"
    android:textColor="@color/black_light"
    android:textSize="15dp" />

<View
    android:id="@+id/view"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_below="@+id/tv_news_content"
    android:layout_marginTop="5dp" />

To make things clear, tv_news_title is the topmost bold TextView, & iv_next_tier is the small arrow-type ImageView at the right. & tv_news_content is the TextView that I am facing problem with.

Любое решение, почему я не получаю желаемого результата? Желаемый вывод означает всегда нормальное поведение - мне нужны эти 3 точки в конце второй строки tv_news_content TextView, а не перед усеченным словом.

Любое предложение приветствуется.


person Khobaib    schedule 16.06.2013    source источник
comment
Что такое iv_next_tier? Я думаю, это поможет нам лучше увидеть весь xml или, по крайней мере, содержимое RelativeLayout.   -  person Cata    schedule 16.06.2013
comment
Что произойдет, если вы измените maxLines="2" на lines="2"?   -  person Ken Wolf    schedule 16.06.2013
comment
@Cata, я уже упоминал, что iv_next_tier — это небольшой ImageView в виде стрелки, который вы видите в правом углу скриншота. Я обновляю xml, выложу полный xml через минуту.   -  person Khobaib    schedule 16.06.2013
comment
@KenWolf, я получаю тот же результат :-(   -  person Khobaib    schedule 16.06.2013
comment
@Khobaib Та же проблема. Вы решили эту проблему?   -  person dilettante    schedule 10.02.2014
comment
Привет, @dilettante, извини за поздний ответ, я как-то пропустил. Я как-то решил эту проблему (не нашел подходящего решения, поэтому сделал какой-то взлом). Я ответил в сообщении RuAware о своих выводах. Взгляни, пожалуйста.   -  person Khobaib    schedule 28.05.2014


Ответы (5)


При настройке текста для текстового представления убедитесь, что текст не превышает 750 символов, поэтому используйте txt = theText.substring(0, 750) или что-то подобное перед вызовом settext. Это работает на эмуляторе с вашим каналом. символов должно хватить и для 10-дюймового планшета.

person RuAware    schedule 16.06.2013
comment
Я пробовал методом проб и ошибок, 750 не работает, но когда я делаю текст длиной не более 300, он работает как для пункта № 3, так и для № 4. Когда я использовал 500, это сработало для № 3, но не для № 4. Мне интересно, в чем причина этого. Можешь дать мне немного света? - person Khobaib; 16.06.2013
comment
ты нашел какое-нибудь правильное решение, так как это решение не подходит @Khobaib - person Chirag Shah; 27.05.2014
comment
нет, я еще не нашел подходящего решения @ChiragShah - person Khobaib; 28.05.2014
comment
Я обнаружил, что 500 — счастливое число в моей ситуации. - person nverbeek; 13.12.2016

Наконец-то нашел причину этой проблемы в моем приложении!

Хотя ответ RuAware привел меня на правильный путь, я обнаружил, что он не решил проблему для всех моих текстовых блоков. Учитывая, что у некоторых это работало, я чувствовал, что это явно связано с каким-то злонамеренным характером. Итак, я прошел через один неработающий текстовый блок и просто начал удалять символы, пока он не перестал ломаться.

Оказывается, это был новый символ строки '\n', который был причиной этого. Даже если новая строка была после размера эллипса, символ новой строки [непоследовательно] вызывал эту проблему, пока он находился где-то внутри строки.

Проблема решается следующим образом:

text = text.replace('\n',' ');
person tabjsina    schedule 28.09.2013
comment
Круто, дай знать, как дела. Проблема, с которой вы ответили в ответе RuAware, вероятно, связана с различным положением новых строк в ваших строках. - person tabjsina; 01.10.2013

Взгляните на этот пост. Существует пользовательский EllipsizingTextView, который решает проблему эллипсизации для многострочного представления. Однако это может решить и вашу проблему.

person Lingviston    schedule 16.06.2013

У меня возникла та же проблема при отображении строки, содержащей текст в формате html.

Удаление всех тегов html с myText.replaceAll("\\<.*?>","") решило проблему.

Вы также можете удалить HTML-теги с помощью Html.fromHtml(myText).toString(), но обратите внимание, что вы должны использовать .toString() и не применять вывод fromHtml непосредственно к TextView. Если некоторые специальные символы закодированы в html (&, >, <...), вы можете снова безопасно применить Html.fromHtml() к окончательной строке.

person franmontiel    schedule 26.08.2014

я использовал :

if (myModel.mDataText().length() > 150) {
    mTextView.setText(Html.fromHtml(myModel.mDataText().substring(0, 150) + "..."));
} else {
    mTextView.setText(Html.fromHtml(myModel.mDataText() + "..."));
}
person Lihar Taavighi    schedule 16.06.2013
comment
извините, я сказал себе, как раньше - person Lihar Taavighi; 16.06.2013
comment
Я нахожу android:singleLine=true, но не проверяю!! вы можете проверить эту ссылку: stackoverflow.com/questions/6768977/text- не имеет эллипса - person Lihar Taavighi; 16.06.2013
comment
@RahilTaavighi, я не хочу, чтобы это была одна строка. Я хочу, чтобы это было 2 вкладыша самое большее. - person Khobaib; 16.06.2013
comment
Добавьте эти строки в тег textview: android:ellipsize=marquee android:singleLine=false android:maxLines=2 - person Lihar Taavighi; 16.06.2013