TextView android: ellipsize = "marquee" работает не так, как ожидалось - программирование

TextView android: ellipsize = "marquee" работает не так, как ожидалось

У меня есть некоторые пользовательские элементы в ListView, и каждый элемент, насколько вам известно, просто TextView в LinearLayout. Я бы хотел, чтобы текст внутри TextView был одной строкой, прокручивающейся по горизонтали, когда текст слишком длинный. Я прочитал много сообщений об этом, и я придумал решение, которое должно было работать, но вместо того, чтобы иметь полную прокрутку текста, у меня есть текст, сокращенный до длины содержащего View и заканчивающийся тремя точками. Я не хочу, чтобы три точки, но весь текст нужно прокручивать.

Это макет элементов в списке (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, прежде чем возвращать View.

Я не могу понять, в чем проблема. Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Как заметил @iDroid Explorer, публикация и принятие ответа может помочь кому-то другому. Адаптация моего ответа к комментарию Тома:

Я нашел решение своей проблемы. После некоторых попыток я понял что проблема была в андроиде: selectAllOnFocus = "true" line (Read @Объяснение причины для вероятной причины). Я просто удалил эту линию, и теперь все работает очень хорошо, текст завершен и прокручивается, как хотелось бы, когда он слишком долго для содержащего представления.

Ответ 2

У меня была такая же проблема сегодня, и я смог ее разобраться. Ни одно из перечисленных решений здесь не срабатывало, поэтому я решил поделиться тем, что исправил его для меня.

TL; ДР: Если вы динамически устанавливаете текст TextView, попробуйте установить необходимые свойства "marquee" в коде, а не в XML файле макета.

Более длинная версия: В моем случае у меня был GridView с адаптером и TextView в каждом элементе. Некоторым элементам был текст, который был слишком длинным, чтобы вписаться в его "ячейку" сетки, и поэтому я хотел, чтобы все элементы, которые были слишком длинны, чтобы прокручивать несколько раз. Поскольку TextView находится в GridView с адаптером, текст, очевидно, был установлен в коде, из текущего элемента адаптера.

С помощью очень мучительной отладки у меня наконец появилась идея установить все параметры marquee в коде вместо из 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);

Ответ 3

Ключ здесь делать setSelected(true); при просмотре текста. Конечно

android:ellipsize="marquee"
android:scrollHorizontally="true"

нужно также установить в xml. Без всего этого шатра не произойдет. Когда-нибудь.

Ответ 4

Поместите свой LinearLayout или ваш TextView внутри HorizontalScrollView. Это позволит полностью отобразить текст и разрешить прокрутку вправо и влево.

Ответ 5

Попробуйте настроить layout_width на "match_parent". TextView нуждается в определенной ширине для работы многоточия и не будет работать с "wrap_content".

Ответ 6

Я столкнулся с тем же вопросом С моим 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". Я просто удалил эту строку, и теперь все работает очень хорошо, текст завершен и прокручивается, как хотелось, когда он слишком длинный для содержащего представления.