Многоточие не работает для TextView внутри пользовательского ListView
Вопрос
У меня есть 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 в адаптере списка.
Вот мой скриншот результата!
Ссылка на эти 3 вопроса:
Я где-то нашел эти атрибуты
<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"/>