Android, How to limit width of TextView (and add three dots at the end of text)?
Asked Answered
D

25

391

I have a TextView that I want to limit characters of it. Actually, I can do this but the thing that I'm looking for is how to add three dots (...) at the end of string. This one shows the text has continue. This is my XML but there is no dots although it limit my text.

<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"/>
Divagate answered 25/5, 2012 at 5:15 Comment(0)
W
860

Deprecated:

Add one more property android:singleLine="true" in your Textview

Updated:

android:ellipsize="end" 
android:maxLines="1"
Woaded answered 25/5, 2012 at 5:19 Comment(12)
Definitely need singleLine when I just attempted this. Even though it says deprecated.Vaginate
android:singleLine="true" is deprecated and has bad side effects. use android:ellipsize="end" and maxLine="1" insteadQuagga
What are the "bad side effects" of using singleLine? See also: Is the xml attribute singleLine deprecated or not in Android?Charlsiecharlton
btw, android:maxLines can be greater than 1 if you want :)Messieurs
Has anyone got this msg " W/StaticLayout: maxLineHeight should not be -1. maxLines:1 lineCount:1" >?Britton
@COLDICE I just started seeing this pop up, I wonder if it came in with the new update. Seems like a bug.Vudimir
when you use deprecated 'singleLine' the hint says you should use 'maxLines' instead, but there is not a single word about 'ellipsize'. Ahhrr! Was it so hard to add a couple of words of how to make a simple TextView single lined? Why should we check Stackoverflow for such a trivial thing?Pagel
you can use android:lines="1" tooLoaves
Sometimes you might need app:layout_constrainedWidth="true" alsoScend
If i use maxLines=1, the text sometimes truncates after 10 characters, sometimes 15, sometimes more or less. So, I used singleLine=true and that solved this issue.Holloway
If singleLine is deprecated, then why is it still in the android documentation? Without any mention of deprecation? developer.android.com/reference/android/widget/…Bystreet
For me it only works with singleLine although it's deprecated. WeirdSpectral
C
187

The following is what I learned by playing around with various options for forcing a TextView to a single line (with and without the three dots).

enter image description here

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

This just forces the text to one line. Any extra text is hidden.

Related:

ellipsize="end"

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

This cuts off the text that doesn't fit but lets users know that the text has been truncated by adding an ellipsis (the three dots).

Related:

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

This makes the text scroll automatically across the TextView. Note that sometimes it needs to be set in code:

textView.setSelected(true);

Supposedly android:maxLines="1" and android:singleLine="true" should do basically the same thing and since singleLine is apparently deprecated I would prefer not to use it, but when I take it out, the marquee doesn't scroll anymore. Taking maxLines out doesn't affect it, though.

Related:

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>

This allows the user to manually scroll to see the whole line of text.

Charlsiecharlton answered 4/5, 2015 at 12:5 Comment(3)
But this is just ellipsizing at the end of every word. Is there any way to add ... in the middle of a very_long_word_without_whitespace... ?Pestilential
@TobiasReich, I'm not aware of a built in way to accomplish that. You could make your own using Paint.measureText.Charlsiecharlton
Sometimes you might need app:layout_constrainedWidth="true" alsoScend
A
90

Try this property of TextView in your layout file..

android:ellipsize="end"
android:maxLines="1"
Amuse answered 25/5, 2012 at 5:20 Comment(0)
S
32

I take it you want to limit width to one line and not limit it by character? Since singleLine is deprecated, you could try using the following together:

android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
Sulfaguanidine answered 6/11, 2012 at 10:46 Comment(0)
K
17

eg. you can use

android:maxLength="13"

this will restrict texview length to 13 but problem is if you try to add 3 dots(...), it wont display it, as it will be part of textview length.

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

     } else {

            userName = data;

    }
        textView.setText(userName);

apart from this you have to use

 android:maxLines="1"
Kylie answered 16/5, 2013 at 6:24 Comment(3)
You should better use "\u2026" instead of "..."Oporto
this was just as an example. if I'm putting strings in Strings.xml then definitely I go for unicodes. Any specific reason you want to put here ?Kylie
Nope. I personally have recently learned of the existence of this character in the Unicode and decided to share this knowledge ;)Oporto
A
12

Use

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

It's how my full TextView looks:

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

Picture of <code>TextView</code>

Apish answered 29/8, 2018 at 22:23 Comment(0)
S
8

Steps to add '...' at end of the text if it is too long:

  1. check that the text width is constant
  2. add these two lines android:ellipsize="end" android:maxLines="1"

Complete code of textview in constraint layout:

<TextView
        android:layout_width="75dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="1"
        android:textSize="15sp"
        android:textAllCaps="false"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="parent" />
Slow answered 28/8, 2021 at 8:51 Comment(2)
Hi, thanks for your answer. Multiple other answer such as this one or this one already explain everything that you say, so when you will have enough reputation, you will be able to upvote them instead of making duplicateAccursed
android:ellipsize="end" and specially android:maxLines="2" it turned out nice. ThanksStarter
S
6

I am using Horizonal Recyclerview.
1) Here in CardView, TextView gets distorted vertically when using

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

Check the bold TextViews Wyman Group, Jaskolski... enter image description here

2) But when I used singleLine along with ellipsize -

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

Check the bold TextViews Wyman Group, Jaskolski... enter image description here

2nd solution worked for me properly (using singleLine). Also I have tested in OS version: 4.1 and above (till 8.0), it's working fine without any crashes.

Sigrid answered 18/1, 2018 at 11:5 Comment(0)
G
5

code:

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

xml:

android:maxLines = "5"

e.g.

In Matthew 13, the disciples asked Jesus why He spoke to the crowds in parables. He answered, "It has been given to you to know the mysteries of the kingdom of heaven, but to them it has not been given.

Output: In Matthew 13, the disciples asked Jesus why He spoke to the crowds in parables. He answered, "It has been given to you to know...

Guyenne answered 4/11, 2013 at 1:36 Comment(0)
C
4

You can limit your textview's number of characters and add (...) after the text. Suppose You need to show 5 letters only and thereafter you need to show (...), Just do the following :

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

}

a little hack ^_^. Though its not a good solution. But a work around which worked for me :D

EDIT: I have added check for less character as per your limited no. of characters.

Confectioner answered 15/1, 2014 at 11:45 Comment(1)
It's already explained hereFlied
S
4

I got the desired result by using

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

The trick is set maxLines and minLines to the same value... and Not just android:lines = "2", dosen't do the trick. Also you are avoiding any deprecated attributes.

Spirituous answered 17/2, 2015 at 15:12 Comment(0)
N
4

You need to add following lines into your layout for the textview

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

Hope this works for you.

Navar answered 1/3, 2016 at 9:22 Comment(0)
S
4

In order to work with the android:ellipsize attribute, you have to limit the layout width of the TextView, such that the text is out of bounds from view of TextView.

So, android:layout_width attribute plays a key role here, set it accordingly.

One example can be:

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

Now, here if the text in android:text="This is a very long text to be displayed" goes out of view from TextView with a android:layout_width="120dp", android:ellipsize="end" will truncate the text and place ...(3 dots) after it. i.e. This is very long... will be displayed in the TextView.

Shelves answered 5/5, 2017 at 9:31 Comment(0)
A
4
        <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"/>
Apus answered 18/7, 2019 at 12:30 Comment(0)
E
3

I think you give fix height and width of text view. Then your solution will work.

Evacuate answered 25/5, 2012 at 5:21 Comment(0)
S
3

you can write this line in xml where you take the textview :

android:singleLine="true"
Sonneteer answered 25/5, 2012 at 5:22 Comment(0)
H
2

The approach of @AzharShaikh works fine.

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

But I realize a trouble that TextView will be truncated by word (in default). Show if we have a text like:

test long_line_without_any_space_abcdefgh

the TextView will display:

test...

And I found solution to handle this trouble, replace spaces with the unicode no-break space character, it makes TextView wrap on characters instead of words:

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

The result:

test long_line_without_any_space_abc...

Hircine answered 7/11, 2016 at 10:15 Comment(0)
B
2

Apart from

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

you should set

android:layout_width="0dp"

also know as "match constraint", because the wrap_content value just expands the box to fit the whole text, and the ellipsize property can't make its effect.

Bewick answered 30/7, 2020 at 0:28 Comment(0)
B
2

Simple for three dots

android:layout_width="100dp" <!--your dp or match_parent or 0dp>
android:maxLines="2" <!--count your line>
android:ellipsize="end"
Berkelium answered 24/11, 2020 at 19:30 Comment(0)
T
1

Add These two lines in your text

android:ellipsize="end"
android:singleLine="true"
Thiazole answered 7/11, 2016 at 10:11 Comment(0)
H
1

In this way you can set the maximum length of the view and, at the same time, you will have dots at the end ("num" is your number of dp):

android:maxWidth="{num}dp"
android:ellipsize="end"
Hospital answered 19/7, 2022 at 11:34 Comment(0)
B
0

you can do that by xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />
Belike answered 6/11, 2017 at 21:37 Comment(1)
How can I put 3 Dots @ end with maxLength="35" property any solution ?Stevie
C
0

set android:maxLength="8" in Textview

if you want to set yourString >5. then set textview length 5+3 (for three-dot)

if (yourString.length()>5) // 
    {
        textview.setText(yourString.substring(0,5)+"...");
    }
    else {
        textview.setText(title);
    }
Callable answered 31/5, 2021 at 5:17 Comment(0)
G
0

1.set static width like 7odp

2.use android:ellipsize="end"

3.use android:maxLines="1"

4.use android:singleLine="true"

<TextView
        android:id="@+id/tv_status"
        **android:layout_width="70dp"**
        android:layout_height="wrap_content"
        android:layout_marginEnd="@dimen/padding_8"
        android:gravity="center|center_horizontal"
        android:includeFontPadding="false"
        android:textColor="@color/black_2a"
        android:textSize="@dimen/text_size_1"
        **android:ellipsize="end"
        android:maxLines="1"
        android:singleLine="true"**
        app:layout_constrainedWidth="true"
        app:borrowStatusText="@{item.lenders[0].status}"
        app:layout_constraintEnd_toStartOf="@id/iv_vector"
        app:layout_constraintTop_toTopOf="parent" />
Groundmass answered 1/6, 2021 at 15:5 Comment(0)
S
-1

You just change ...

android:layout_width="wrap_content"

Use this below line

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>
Sisterinlaw answered 15/10, 2014 at 13:53 Comment(1)
singleLine is deprecatedGeneralize

© 2022 - 2024 — McMap. All rights reserved.