60

I have a TextView in my layout which is wrap_content in layout_width. It is limited to maximum of 15 characters so I'm using maxLength.

I need to end this TextView with 3 dots (...) and it happens only when I give the layout_width a fixed size in dp, something that I don't want to do.

I know it is possible programmatically by trimming the string after the 15th character and then adding the 3 dots, but I prefer to do that by XML.

Any idea how to end the text with 3 dots and leave it wrap_content?

<TextView
    android:id="@+id/inbox_contactName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:lines="1"
    android:maxLines="1"
    android:ellipsize="end"
    android:singleLine="true"
    android:maxLength="15"
    android:textColor="#0670b4"
    android:textSize="16sp" />
Yaniv
  • 2,971
  • 6
  • 26
  • 44

11 Answers11

79

This will solve your problem, Use ellipsize Property in your XML Code

android:ellipsize="end" <!-- This makes the magic ... thing -->
android:maxEms="15" <!-- Limit of the Text -->
android:singleLine="true" <!-- In case if you want everything in one line -->

Edit: singleLine is deprecated. Use maxlines="1" instead.

Ali Bdeir
  • 4,591
  • 9
  • 46
  • 101
Kirk
  • 4,604
  • 2
  • 27
  • 54
  • I noticed today that `singleLine="true"` and `maxlines="1"` behave differently when used with `maxWidth` and `ellipsize` - for some reason it truncates more with `maxlines` - don't know why though. – NemoOudeis Nov 30 '16 at 06:14
  • 8
    @Kirk maxEms is not working for restricting the number of digits, whereas, using maxLength, doesn't show dots. – Narendra Singh Feb 04 '17 at 11:14
  • 2
    @king possibly deprecated. At the time of answering this question, It was a working solution. If anybody knows the latest patch to this, Kindly update my answer. – Kirk Feb 04 '17 at 11:23
  • Ems != number of characters – AlexAndro May 02 '18 at 13:50
  • @AlexAndro what's that dude? – Kirk May 02 '18 at 19:23
  • @Kirk Just an info! It seems to me that some people think is the same thing. – AlexAndro May 03 '18 at 08:44
  • This doesn't solve the problem, as `maxEms` limit the width to fixed value. It will work only if you are developin app for certain resolution, which is usually never. – Firzen May 01 '19 at 15:41
  • @Firzen Answer is targetted for the OP's question, not for you. In my answer, I didn't state what EMS does or how it behaves. Also, it's called EMS, not pixel limiter. You might be expecting a different answer to your question. Hope you understand the difference as well before you downvote. – Kirk May 06 '19 at 07:58
19

You cannot use both maxLength and Ellipsize although you can define Maximum EMS see the example below

<TextView
        android:id="@+id/tv_hist_source_lang"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxEms="8"
        android:maxLines="1"
        android:text="TextView"
        android:textAppearance="?android:attr/textAppearanceMedium" />

It looks like this

AZ_
  • 35,659
  • 28
  • 152
  • 199
18

I gather (from comment) that @Yaniv already solved it using code - but this is the right way to do it (with xml). May help other users who land here. Trick is to use both toleftof and torightof.

<RelativeLayout>
...
 <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:singleLine="true"
        android:layout_toRightOf="@id/some_element1"
        android:layout_toLeftOf="@id/some_element2"/>
...
<RelativeLayout>
Ravi
  • 3,159
  • 6
  • 24
  • 39
13

You can use

android:maxWidth="100dp"
android:maxLines="1"
android:ellipsize="end"

Only this works for me.

Zhou Hongbo
  • 499
  • 5
  • 13
7

use this android:ellipsize="end"

Mahmoud Hashim
  • 552
  • 5
  • 13
4

One of the easiest way is to add Right Padding + Ellipsize

<TextView
            android:id="@+id/txtvw_contentcell_subhead"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Polem sampler, Lorem Ipsum golep tolem burop yemit noski"
            android:ellipsize="end"
            android:maxLines="1"
            android:textColor="@color/caption_black_color"
            android:textSize="@dimen/caption_size"
            android:paddingRight="40dp"/>

Here is an example Subtitle Text with char limit. enter image description here

Enzokie
  • 7,079
  • 6
  • 28
  • 39
1

Very Important: ellipsize = "end" only works when maxLength is set to a value that is more than the number of characters on one line. You can use wrap_content if you align the TextView's end and start to any other view(s).

1

Tried most of the solutions above. Using maxWidth was the key for me:

android:maxWidth="100dp"
android:maxLines="1"
android:ellipsize="end"
John T
  • 455
  • 6
  • 16
0

I needed to do this with Radio Button and I wanted to limit the size to one line. When I used Android:singleline="true", radio button's check circle disappeared. Here's the code that finally worked:

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

There's no need to set ems. This will probably work also in TextView and other UI components. Hope this helps to someone.

Micer
  • 7,430
  • 3
  • 68
  • 61
0

You can just modify the String when it's length is above 20 to add the ellipsize.

Horatio
  • 1,405
  • 1
  • 16
  • 26
-1

remove the line from xml

android:lines="1"
        android:maxLines="1"
Muhammad Aamir Ali
  • 18,753
  • 9
  • 62
  • 54