2013-07-01 6 views
13

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

Это расположение элементов в списке (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() адаптера (который расширяет базовый адаптер) я использую метод setSelected(true) в TextView, прежде чем возвращать представление.

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

+0

У меня также такая же проблема! Я пробовал много разных решений, и никто из них не работал! – thiagolr

+0

Привет, Андре, не могли бы вы разместить свой getView(), пожалуйста? Благодарю. – Tom

+0

Я думаю, что довольно ясно, что здесь происходит. Однако есть два решения, и я не могу сказать, какой из них вам нужен без кода! Итак, скажите мне, если вы программно установите свой 'ListView' s.t. 'setItemsCanFocus (false)', это решает вашу проблему? Если нет, есть что-то еще, что это исправит. – Tom

ответ

1

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

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

+1

Могу ли я получить хотя бы объяснение нисходящего потока? Если предлагаемое решение не работает ни для кого, это не означает, что само решение ошибочно. Это может быть связано с различными условиями или по другим причинам ... – Andre

+0

Фокус принимал другой взгляд на мой макет, дал его текстуру и voilà, он работает как ожидалось. Благодарю вас. – moujib

0

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

+1

Отличная идея, но я думаю, что это было бы не так, как шатер ...? – Tom

+0

Спасибо за ответ Майк, см. Мой комментарий к предложению Тома. Фактически, удаление строки 'android: selectAllOnFocus =" true "' решило проблему! – Andre

0

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

+1

Спасибо за ответ chirsbjr, но я уже пробовал изменения, которые вы предложили без успеха. Действительно, атрибут 'wrap_content' хорошо работает для TextView. См. Мой комментарий к предложению Тома в исходном вопросе. Фактически, удаление строки 'android: selectAllOnFocus =" true "' решило проблему! – Andre

+0

@chrisbji можно в Linear layout у меня есть текст внутри Linearlayout, и я хочу установить шатер в linearlayout ?? – Amitsharma

28

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

TL; DR: Если вы динамическая настройка текста TextView, попробуйте установить необходимый «шатер» свойство в коде, а не в файле макет 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); 
+1

К счастью, я уже решил, но спасибо за то, что поделился своим решением, он может быть полезен для всех, у кого есть подобные проблемы. Я лично предпочитаю оставить все в макете xml и программно установить только то, что невозможно установить в xml (но это, конечно, вопрос личных предпочтений). – Andre

+0

Абсолютно, я полностью согласен. Моя проблема заключалась в том, что установка их в xml не работала и вызывала нечетное поведение, описанное выше.(Показывая 3 точки во время прокрутки, а не полный текст.) Я бы предпочел установить свойства в xml, но по какой-то причине установка их в код (после того, как текст установлен) решил мою проблему. Я предполагаю, что математика для анимации эллипсиса и выделения выделяется слишком рано и до того, как текст действительно задан динамически. (В моем случае текст должен быть установлен в коде, потому что это было повторное представление и адаптер.) – kdenney

+0

Неплохо, что с вашей настройкой XML происходят неожиданные вещи при вызове чего-то невинного, как '.setText()'. :( – Diederik

12

Ключ здесь, чтобы сделать setSelected(true); на виде текста .. Конечно

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

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

+0

Мне нужно было добавить singleLine = "true", что особенно странно, поскольку оно устарело. –

0

Я столкнулся с тем же вопросом.

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

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