Як я можу показати еліпси на своєму TextView, якщо він більший за 1 рядок?


100

У мене є такий макет, який не працює:

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:id="@+id/experienceLayout" 
    android:background="#ffffff" 
    android:layout_height="match_parent" 
    android:paddingLeft="6dp" 
    android:paddingRight="6dp" 
    android:paddingBottom="6dp" 
    android:paddingTop="6dp">

    <TextView 
        android:layout_weight="1" 
        android:id="@+id/experienceLabel" 
        android:text="Experience" 
        android:layout_height="wrap_content" 
        android:textColor="#000000" 
        android:layout_width="wrap_content" 
        android:textStyle="bold">
    </TextView>

    <TextView 
        android:id="@+id/experienceTextView" 
        android:text="TextView" 
        android:layout_height="wrap_content" 
        android:textColor="#000000" 
        android:layout_width="wrap_content" 
        android:ellipsize="end" 
        android:lines="1" 
        android:maxLines="1" 
        android:singleLine="true" 
        android:fadeScrollbars="false">
    </TextView>

</LinearLayout>

Відповіді:


286

Це поширена проблема. Спробуйте використовувати наступне:

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

.............. прокрутка Горизонтально - це "спеціальний соус", який змушує його працювати.


12
Дивно ... Я намагався, android:scrollHorizontally="true"але це не вийшло, мені довелося використовувати атрибут застарілого android:singleLine="true".
Джерардо Контійох

1
так, scrollHorizontallyце власне ключ до...
Rishabh Dutt Sharma

прокручування по горизонталі? Очевидно, я не хочу ефекту горизонтальної прокрутки.
filthy_wizard

@ user1232726: Так, "прокручуйте по горизонталі". Що стосується здорового глузду, погляньте на дату питання та дату відповідей ... Само собою зрозуміло, що жоден з них не може бути відносним (перед тим, як коментувати).
BonanzaDriver

Використання elipsize з maxLines може призвести до збою програми - Звіт від Android Studio intellisense
Vaishnav Mhetre


25

Використовуй це

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

Не використовуйте це без повного усвідомлення того, який вихід виходить

android:ellipsize="end"  
android:maxLines="1"

Коли ви користуєтесь maxlines = 1цим, якийсь час урізає більшість персонажів.


12

Те, як воно працювало для мене на кількох пристроях / API, було програмно таким (де телевізор - це ваш TextView):

    if (tv.getLineCount() > 1) {
        int lineEndIndex = tv.getLayout().getLineEnd(0);
        String text = tv.getText().subSequence(0, lineEndIndex - 3) + "\u2026";
        tv.setText(text);
    }

2
Це найкорисніша відповідь з усіх ... працює на кожному окремому API і його можна легко перетворити у бібліотеку Utils.
Mariano Zorrilla

1
Ви повинні використовувати символ еліпсису \u2026замість трьох .персонажів
Кріс Стилвелл

Ви праві @ChrisStillwell, і я використовую символ еліпсису у своєму коді. Я відредагував відповідь, дякую. :)
Марілія

3

Отже, всі відповіді, наведені вище, відповідають вимозі, що на екрані має з’явитися лише 1 рядок, а потім еліпсис. Однак якщо ви хочете, щоб еліпсис з’являвся після певних рядків тексту, тоді слід скористатися наступним:

android:ellipsize="end"
android:maxLines="2"
android:singleLine="false"

При цьому еліпсис з’явиться лише через 2 рядки. Примітка. Важливо мати singleLine як хибну.


Значення за замовчуванням є помилковим відповідно до документації: developer.android.com/reference/android/widget/…
П'єр


-1

android:singleLineзастаріло. У моєму випадку мені довелося отримати фіксовану висоту для TextViewі я використовував android:linesатрибут замість android:maxLines. Я думав, що це може допомогти комусь із тією ж проблемою, що і моя.

android:ellipsize="end"
android:lines="2"

Неправда. Документація нічого не говорить про
анулювання

@cesards Цікаво. У цьому документі сказано, що це - developer.android.com/reference/android/R.attr.html#singleLine
Reaz Murshed
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.