Android, як обмежити ширину TextView (і додати три крапки в кінці тексту)?


317

У мене є TextViewте, що я хочу обмежити його символами. Власне, я можу це зробити, але те, що я шукаю, - це додати три крапки (...) в кінці рядка. Цей показує, що текст продовжується. Це мій XML, але немає крапок, хоча це обмежує мій текст.

<TextView 
        android:id                      = "@+id/tvFixture"
        android:layout_width            = "wrap_content"
        android:layout_height           = "wrap_content"
        android:layout_toLeftOf         = "@id/ivFixture_Guest"
        android:text                    = "@string/test_06"
        android:lines                   = "1"
        android:ems                     = "3"
        android:gravity                 = "right"
        style                           = "@style/simpletopic.black" 
        android:ellipsize="end"/>

Відповіді:


690

Застаріле:

Додайте ще одну властивість android:singleLine="true"у Textview

Оновлено:

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

3
Однозначно потрібен singleLine, коли я щойно спробував це. Навіть незважаючи на те, що це сказати застаріло.
EGHDK

41
android: singleLine = "true" застаріло і має погані побічні ефекти. використовуйте андроїд: ellipsize = "end" та maxLine = "1" замість цього
Hamidreza Hosseinkhani

1
Які «погані побічні ефекти» вживання singleLine? Дивіться також: Чи застарілий атрибут xml singleLine в Android?
Сурагч

1
btw, android: maxLines може бути більшим за 1, якщо ви хочете :)
Держатель Touré

1
Хто-небудь отримав цю msg "W / StaticLayout: maxLineHeight не повинен бути -1. MaxLines: 1 рядокCount: 1">?
Холодний ДВС

157

Далі я дізнався, розібравшись з різними варіантами примушування TextViewдо одного рядка (із трьома крапками та без них).

введіть тут опис зображення

android: maxLines = "1"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:text="one two three four five six seven eight nine ten" />

Це просто змушує текст в один рядок. Будь-який додатковий текст приховано.

Пов'язані:

ellipsize = "кінець"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:ellipsize="end"
    android:text="one two three four five six seven eight nine ten" />

Це відрізає текст, який не підходить, але дає користувачам знати, що текст був урізаний, додавши еліпсис (три крапки).

Пов'язані:

ellipsize = "marquee"

<TextView
    android:id="@+id/MarqueeText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="one two three four five six seven eight nine ten" />

Це змушує автоматично прокручувати текст через TextView. Зауважте, що іноді це потрібно встановити в коді:

textView.setSelected(true);

Нібито, android:maxLines="1"і в android:singleLine="true"основному слід робити те ж саме, і оскільки singleLine, мабуть, застарілий, я вважаю за краще не використовувати його, але коли я його виймаю, штрих вже не прокручується. Виймання maxLinesне впливає на це.

Пов'язані:

HorizontalScrollView with scrollHorizontally

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/horizontalScrollView">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:scrollHorizontally="true"
        android:text="one two three four five six seven eight nine ten" />
</HorizontalScrollView>

Це дозволяє користувачеві вручну прокручувати, щоб побачити весь рядок тексту.


Але це просто еліпсис в кінці кожного слова. Чи є якийсь спосіб додати ... посеред дуже_long_word_without_whitespace ...?
Тобіас Райх

@TobiasReich, я не знаю про побудований спосіб цього досягти. Ви можете зробити власні, використовуючи Paint.measureText .
Сурагч

Іноді вам може знадобитися додаток: layout_constrainedWidth = "true" також
Dan Crisan


31

Я вважаю, ви хочете обмежити ширину одним рядком, а не обмежувати його символом? Оскільки singleLineзастаріле, ви можете спробувати використовувати наступне:

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

13

напр. ви можете використовувати

android:maxLength="13"

це обмежить довжину текстового перегляду до 13, але проблема полягає в тому, що якщо ви спробуєте додати 3 крапки (...), він не буде відображати його, оскільки це буде частиною довжини перегляду тексту.

     String userName;
     if (data.length() >= 13) {
            userName = data.substring(0, 13)+ "...";

     } else {

            userName = data;

    }
        textView.setText(userName);

крім цього вам доведеться користуватися

 android:maxLines="1"

2
Вам слід краще використовувати "\ u2026" замість "..."
Жарро

це було лише як приклад. якщо я вкладаю рядки в Strings.xml, я, безумовно, переходжу до unicodes. Якась конкретна причина, яку ви хочете вказати тут?
Наянеш Гупте

2
Ні. Я особисто нещодавно дізнався про існування цього персонажа в Unicode і вирішив поділитися цими знаннями;)
Zharro

6

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

  • android:singleLine="true"
  • android:maxLines="1"
  • app:layout_constrainedWidth="true"

Ось як TextViewвиглядає мій повний :

    <TextView
    android:id="@+id/message_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="5dp"
    android:maxLines="1"
    android:singleLine="true"
    android:text="NAME PLACEHOLDER MORE Text"
    android:textColor="@android:color/black"
    android:textSize="16sp"

    android:textStyle="bold"
    app:layout_constrainedWidth="true"
    app:layout_constraintEnd_toStartOf="@id/message_check_sign"
    app:layout_constraintHorizontal_bias="0"
    app:layout_constraintStart_toEndOf="@id/img_chat_contact"
    app:layout_constraintTop_toTopOf="@id/img_chat_contact" />

Зображення <code> TextView </code>


5

Я використовую Horizonal Recyclerview.
1) Тут у CardView TextView спотворюється вертикально при використанні

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

Перевірте сміливі TextViews Wyman Group, Jaskolski ... введіть тут опис зображення

2) Але коли я використовував singleLine разом з ellipsize -

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

Перевірте сміливі TextViews Wyman Group, Jaskolski ... введіть тут опис зображення

2-е рішення працювало для мене належним чином (використовуючи singleLine). Також я перевірив версію ОС: 4.1 і вище (до 8.0), він працює нормально без збоїв.


4

код:

TextView your_text_view = (TextView) findViewById(R.id.your_id_textview);
your_text_view.setEllipsize(TextUtils.TruncateAt.END);

xml:

android:maxLines = "5"

напр

У Матвія 13 учні запитували Ісуса, чому Він говорив до натовпу притчами. Він відповів: "Дано вам знати таємниці Царства Небесного, але їм це не було дано.

Вихід: У Матвія 13 учні запитали Ісуса, чому Він говорив до натовпу притчами. Він відповів: "Дано вам знати ...


4

Я отримав бажаний результат, використовуючи

android:maxLines="2"
android:minLines="2"
android:ellipsize="end"

Трюк встановлює maxLines та minLines на одне і те ж значення ... І не тільки андроїд: строки = "2", не потрібно робити фокус. Також ви уникаєте будь-яких застарілих атрибутів.


4

Для перегляду тексту потрібно додати наступні рядки у ваш макет

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

Сподіваюся, це працює для вас.


3

Можна обмежити кількість символів перегляду тексту та додати (...) після тексту. Припустимо, вам потрібно показати лише 5 літер, і після цього потрібно показати (...), просто виконайте наступне:

String YourString = "abcdefghijk";

if(YourString.length()>5){

YourString  =  YourString.substring(0,4)+"...";

your_text_view.setText(YourString);
}else{

 your_text_view.setText(YourString); //Dont do any change

}

трохи рубати ^ _ ^. Хоча це не вдале рішення. Але робота, навколо якої працював для мене: D

EDIT: Я додав чек на менше символів відповідно до вашого обмеженого немає. символів.



3

Для роботи з Android: ellipsize атрибут, ви повинні обмежити ширину макета в TextView , так що текст виходить за межі з урахуванням TextView.

Отже, атрибут android: layout_width відіграє тут ключову роль, встановіть його відповідно.

Одним із прикладів може бути:

<TextView        
    android:layout_width="120dp"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:text="This is a very long text to be displayed"
    android:textSize="12sp"
    android:maxLines="1"            
     />

А тепер іди , якщо текст в андроїд: текст = «Це дуже довгий текст , який буде відображатися» виходить з поля зору з TextView з андроидами: layout_width = «120dp» , андроїд: ellipsize = «кінець» буде обрізати текст і місце ... (3 крапки) після нього. тобто це дуже довго ... буде відображено в TextView.




2

Підхід @AzharShaikh працює чудово.

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

Але я усвідомлюю проблему, що TextView буде обрізаний словом (за замовчуванням). Покажіть, чи є у нас такий текст, як:

тест long_line_without_any_space_abcdefgh

У TextView з'явиться:

тест ...

І я знайшов рішення вирішити цю проблему, замінити пробіли символом простору unicode без перерви, це робить TextView загортанням на символи замість слів:

yourString.replace(" ", "\u00A0");

Результат:

тест long_line_without_any_space_abc ...


2
        <TextView
            android:id="@+id/product_description"
            android:layout_width="165dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:paddingLeft="12dp"
            android:paddingRight="12dp"
            android:text="Pack of 4 summer printed pajama"
            android:textColor="#d2131c"
            android:textSize="12sp"
            android:maxLines="2"
            android:ellipsize="end"/>


0

ви можете це зробити xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />

Як я можу поставити 3 Dots@ end з maxLength="35"властивістю будь-яке рішення?
Сагар

-1

Ви просто змінюєте ...

android:layout_width="wrap_content"

Використовуйте це під рядком

android:layout_width="match_parent"

.......

   <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_marginLeft="10dp"
       android:layout_marginTop="10dp"
       android:layout_toRightOf="@+id/visitBox"
       android:orientation="vertical" >

             <TextView
                  android:id="@+id/txvrequestTitle"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:singleLine="true"
                  android:text="Abcdefghighiklmnon"
                  android:textAppearance="? 
                  android:attr/textAppearanceLarge"
                  android:textColor="@color/orange_color" />

   </LinearLayout>

застарілий singleLine
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.