TextView android: ellipsize= "marquee" работает не так, как ожидалось
у меня есть некоторые пользовательские элементы в ListView, и каждый элемент, чтобы знать, просто TextView в LinearLayout. Я хотел бы, чтобы текст внутри TextView был одной строкой, прокручивающейся по горизонтали, когда текст слишком длинный. Я прочитал много сообщений об этом, и я придумал решение, которое должно было работать, но вместо того, чтобы прокручивать полный текст, у меня есть текст, вырезанный по длине содержащего представления и заканчивающийся тремя точками. Мне нужны не три точки, а весь текст. нужно прокрутить.
это расположение элементов в списке (list_item.в XML)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listItem"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/list_item_selector"
android:orientation="horizontal"
android:paddingBottom="7dp"
android:paddingLeft="15dp"
android:paddingTop="7dp" >
<TextView
android:id="@+id/listText"
style="@style/Text_View_Style_White"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:padding="3dp"
android:selectAllOnFocus="true"
android:singleLine="true"
android:textColor="@drawable/list_item_text_selector" />
</LinearLayout>
Я пробовал также с android:focusable="true"
, android:scrollHorizontally="true"
и android:maxLines="1"
атрибуты, но ни один из них не работает. В getView()
метод адаптера (который расширяет BaseAdapter) я использую setSelected(true)
метод в TextView, прежде чем возвращать представление.
Я не могу понять в чем проблема. Любая помощь будет высоко оценена.
6 ответов
у меня была такая же проблема сегодня и я смог понять это. Ни одно из перечисленных решений здесь не работало, поэтому я подумал, что поделюсь тем, что исправил его для меня.
TL; DR: Если вы динамически устанавливаете текст TextView, попробуйте установить необходимые свойства "marquee" в коде, а не в xml-файле макета.
версия: В моем случае у меня был GridView с адаптером и TextView в каждом элементе. Часть товара была текст слишком долго, чтобы поместиться в его "ячейку" сетки, и поэтому я хотел, чтобы все элементы, которые были слишком длинными, прокручивались несколько раз. Поскольку TextView находится в GridView с адаптером, текст, очевидно, устанавливается в коде из текущего элемента адаптера.
через очень болезненную отладку у меня наконец появилась идея установить все настройки шатра в коде в XML-файл макета. Это вызвало 3 точки (...), чтобы, наконец, уйти от TextView и начать вместо этого прокрутка.
вот как выглядит мой файл макета: (обратите внимание, что ни одно из перечисленных выше свойств не установлено здесь)
<TextView
android:text="Placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:id="@+id/name"
/>
и вот как выглядит мой код адаптера:
nameView.setText(name);
nameView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
nameView.setSingleLine(true);
nameView.setMarqueeRepeatLimit(5);
nameView.setSelected(true);
ключ здесь setSelected(true);
на текстовое представление.. Конечно!--3-->
android:ellipsize="marquee"
android:scrollHorizontally="true"
необходимо также установить в xml. Без всего этого шатра не обойтись. Когда-либо.
как отметил @iDroid Explorer, публикация и принятие ответа могут помочь кому-то другому. Адаптируясь из моего ответа на комментарий Тома:
Я нашел решение моей проблемы. После некоторых попыток я понял что проблема была в android: selectAllOnFocus=" true " строка (читать @ Tom's explanation for probabale reason). Я просто убрал эту линию, и теперь все работает очень хорошо, текст завершен и прокрутка, как желательно, когда это слишком долго для содержания вид.
либо поставить свой LinearLayout
или TextView
внутри HorizontalScrollView
. Это позволит отображать текст в полном объеме и позволяет прокручивать вправо и влево.
попробуйте установить layout_width в "match_parent". TextView требует определенной ширины для работы многоточия и не будет работать с "wrap_content".
я столкнулся с той же проблемой с моим textView теперь получил причину, почему он показывает ...в конце текста.!
<TextView
android:id="@+id/MarqueeText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="2dp"
android:ellipsize="marquee"
android:singleLine="true"
android:maxLines="1"
android:textColor="@color/text_gray"
android:textSize="14sp"
android:text="START | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | END" />
и после инициализации в моей деятельности
MarqueeText.setSelected(true);
Я нашел решение моей проблемы. После некоторых попыток я понял, что проблема была android:textIsSelectable="true"
. Я просто удалил эту строку, и теперь все работает очень хорошо, текст завершен и прокручивается, как требуется, когда он слишком длинный для содержащего представления.