Многоточие не работает для TextView внутри пользовательского ListView

StackOverflow https://stackoverflow.com/questions/1424276

  •  07-07-2019
  •  | 
  •  

Вопрос

У меня есть ListView с пользовательскими объектами, определенными приведенным ниже xml-макетом.Я хочу, чтобы TextView с идентификатором "info" был с многоточием в одной строке, и я попытался использовать атрибуты

android:singleLine="true"
android:ellipsize="end"

безуспешно.

Если я установлю layout_width на фиксированную ширину, например,

android:layout_width="100px"

текст усечен нормально.Но по соображениям переносимости это неприемлемое решение.

Можете ли вы определить проблему?

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="5px"
>
<TextView  
android:id="@+id/destination"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textSize="22dp"
android:paddingLeft="5px"
/>

<TextView  
android:id="@+id/date"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textSize="15dp"
android:paddingLeft="5px"
/>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/info_table"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5px"
android:paddingTop="10px" 
>
    <TableRow>
        <TextView
            android:id="@+id/driver_label"
            android:gravity="right"
            android:paddingRight="5px"
            android:text="@string/driver_label" />
        <TextView
            android:id="@+id/driver" />
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/passenger_label"
            android:gravity="right"
            android:paddingRight="5px"
            android:text="@string/passenger_label" />
        <TextView
            android:id="@+id/passengers" />
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/info_label"
            android:gravity="right"
            android:paddingRight="5px" 
            android:text="@string/info_label"/>
        <TextView
            android:id="@+id/info"
            android:layout_width="fill_parent"
            android:singleLine="true"
            android:ellipsize="end" />
    </TableRow>
</TableLayout> 

Это было полезно?

Решение

Многоточие разбито (перейти проголосуйте за отчет об ошибке, тем более что они утверждают, что это невоспроизводимо), так что вам придется использовать небольшой взлом.Использование:

android:inputType="text"
android:maxLines="1"

на всем, что вы хотите поставить многоточие.Кроме того, не используйте singleLine, это устарело.

Обновить:

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

<TableLayout
    android:id="@+id/info_table"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingLeft="5px"
    android:paddingTop="10px"
    android:shrinkColumns="1">

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

Другие советы

Без использования устаревших свойств следующие строки отлично подходят для меня

android:ellipsize="end" 
android:lines="1"
android:scrollHorizontally="true"

ссылка http://code.google.com/p/android/issues/detail?id=882#c9

У меня были те же результаты, что и у Стива:

android: многоточие = "marquee" android: Горизонтальная прокрутка= "true" android:строки ="1"

работает отлично

попробуй...

т. е.

android:ellipsize="marquee"
android:focusable="true" android:marqueeRepeatLimit="num|marquee_forever"
android:lines="1" android:focusableInTouchMode="true"
android:scrollHorizontally="true"

поскольку marquee работает только тогда, когда вид выбран или сфокусирован в соответствии с комментарием № 2 к http://code.google.com/p/android/issues/detail?id=5364

После проверки этих 3 проблем (закрытых и вновь открытых) и предыдущих сообщений, я думаю, ключ в том, чтобы обернуть TextView внешним LinearLayout (или любым другим макетом, который вы используете) и установить "layout_width ( ширина разметки )" немного больше ширины внешнего макета МЕНЬШИЙ чем длина текста, содержащегося в TextView.Кажется, должен ПРЕДЕЛ ширина, позволяющая "android: ellipsize" вести себя должным образом.

Следуйте совету в этот вопрос, после добавления всех этих атрибутов для взлома, я также установил layout_width внешнего LinearLayout на 240dp, например:

<Linearlayout
  android:layout_width="240dp"
  android:layout_height="wrap_content"
  ...>

    <TextView
     ....
     android:singleLine="true"
     android:lines="1"
     android:maxLines="1"
     android:scrollHorizontally="true"
     android:ellipsize="end"
     android:text="this is a text which length should be longer than 240dp"
    />
</LinearLayout>

Чем я могу успешно сделать так, чтобы в конце TextView отображалось "...", не очень приемлемо, но это работает!И я думаю, что это работает независимо от того, используется ли в обычном TextView или TextView в адаптере списка.

Вот мой скриншот результата!

hope it helps ^^

Ссылка на эти 3 вопроса:

выпуск 882

выпуск 10554

выпуск 31229

Я где-то нашел эти атрибуты

<TextView ...
android:singleLine="true"
android:ellipsize="marquee" />

у меня это работает нормально (Android 1.5)

Для меня этот атрибут сработал.Я тестировал на API 8 и последующих версиях

В формате XML

<TextView
 ....
 android:maxLines="1"
 android:scrollHorizontally="true"
 android:ellipsize="end"
 ....
/>

Программно

setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);

Если вы поместили TextView в созданную вами пользовательскую ViewGroup, обязательно измерьте ее еще раз, если вы изменили размер после измерения.

Например, я вычислил новое измерение в onLayout .Прежде чем вызывать дочернее устройство.макет, вызовите

measureChild(child,
    View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
    View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));

У меня была такая же проблема с картой просмотра recycler.Я решил эту проблему, добавив следующий код:

    <TextView
        android:ellipsize="end"
        android:maxLines="1"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top