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"/>
Hesam
источник

Ответы:

693

Запрещены:

Добавьте еще одно свойство android:singleLine="true"в вашем Textview

Обновлено:

android:ellipsize="end" 
android:maxLines="1"
Мохаммед Ажаруддин Шейх
источник
3
Определенно нужен singleLine, когда я только что попытался это сделать. Хотя это говорит, что устарела.
EGHDK
41
android: singleLine = "true" устарела и имеет плохие побочные эффекты. вместо этого используйте android: ellipsize = "end" и maxLine = "1"
Хамидреза Хоссейнхани,
1
Каковы "плохие побочные эффекты" использования singleLine? Смотрите также: Является ли атрибут xml singleLine устаревшим или нет в Android?
Сурагч,
1
Кстати, Android: maxLines может быть больше 1, если хотите :)
Touré Holder
1
Кто-нибудь получил это сообщение "W / StaticLayout: maxLineHeight не должно быть -1. MaxLines: 1 lineCount: 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 = "бегущая строка"

<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 с прокруткой по горизонтали

<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>

Это позволяет пользователю прокручивать вручную, чтобы увидеть всю строку текста.

Suragch
источник
Но это просто многоточие в конце каждого слова. Есть ли способ добавить ... в середину очень длинного слова с пустым пространством ...?
Тобиас Райх
@TobiasReich, я не знаю, каким образом это можно сделать. Вы можете сделать свой собственный, используя Paint.measureText .
Сурагч,
Иногда вам может понадобиться app: layout_constrainedWidth = "true"
Дэн Крисан,
80

Попробуйте это свойство TextView в вашем файле макета.

android:ellipsize="end"
android:maxLines="1"
Нирандж Патель
источник
31

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

android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
зубрила
источник
13

например. ты можешь использовать

android:maxLength="13"

это ограничит длину texview до 13, но проблема в том, что если вы попытаетесь добавить 3 точки (...), он не будет отображаться, так как это будет частью длины textview.

     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
Нет. Я лично недавно узнал о существовании этого персонажа в Юникоде и решил поделиться этими знаниями;)
Жарро
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>

kyrylo_23
источник
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 ученики спросили Иисуса, почему Он говорил с толпами притчами. Он ответил: «Вам дано знать ...

ruin3936
источник
4

Я получил желаемый результат с помощью

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

Для трюка установлено одинаковое значение для maxLines и minLines ... и не только для android: lines = "2", но не для этого. Также вы избегаете любых устаревших атрибутов.

user1974433
источник
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

РЕДАКТИРОВАТЬ: я добавил чек на меньшее количество символов в соответствии с вашим ограниченным нет. персонажей.

TheLittleNaruto
источник
Это уже объяснено здесь
Соломенная Шляпа
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"            
     />

Теперь, если текст в android: text = "Это очень длинный текст для отображения" выходит из поля зрения TextView с помощью android: layout_width = "120dp" , android: ellipsize = "end" будет обрезать текст и место ... (3 точки) после него. т.е. это очень долго ... будет отображаться в TextView.

Androwed
источник
2

Я думаю, что вы даете фиксировать высоту и ширину просмотра текста. Тогда ваше решение будет работать.

Винай Кумар Багел
источник
2

Вы можете написать эту строку в XML, где вы берете textview:

android:singleLine="true"
Джей Таккар
источник
2

Подход @AzharShaikh работает отлично.

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

Но я понимаю беду, что TextView будет усечен по слову (по умолчанию) Показать, если у нас есть текст, как:

test long_line_without_any_space_abcdefgh

TextView отобразит:

тест...

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

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

Результат:

test 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"/>
Камран Рахматулла
источник
1

Добавьте эти две строки в свой текст

android:ellipsize="end"
android:singleLine="true"
САНДЖЕЙ ГУПТА
источник
0

Вы можете сделать это xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />
Халид Таха
источник
Как я могу поставить 3 Dots@ конец со 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 устарела
Ник