How do you set a text leading on a TextView? Or how do you shift a text position relative to a view that it is in?
I want the height of the textview to be less than what wrap_content would set at default without cutting the text from the bottom.
I've tried using the layout_height tag on its xml layout but it would clip the text from the bottom just like the image I've provided on the link below, and I also have tried using the lineSpacingExtra tag but it seems to only work for the distance/leading between two lines.
Here is my xml file:
<TextView
android:layout_width="0dp"
android:layout_height="30dp"
android:text="clipped text"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:lineSpacingExtra="-18dp"
android:text="a text longer than usual to demonstrate line spacing"/>
Image for clarity: https://i.stack.imgur.com/QGV4B.png
Why you can use wrap_content? Or can you share what are you trying to achieve?
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="clipped text"/>
Did you try to do it using padding or paddingTop ? Try it with different values to get your desired result.
<TextView
android:layout_width="0dp"
android:layout_height="30dp"
android:paddingTop="0dp"
android:text="clipped text"/>
I have hints set on my TextViews which have android:layout_width="wrap_content" set and if the text that is typed into the TextView is not as wide as the width of the hint-text, then the TextView won't change its width to wrap the text. However, if the text that is entered is wider than the width of the hint-text, and given there is room for the TextView to widen, then it will grow to wrap the text.
Ideally, what I would like is for the TextView to shrink to my text regardless of what the width of the hint-text was (the original width of the TextView), but I will also except answers that provide a way to get the width of my text, so I can just call setWidth on the TextView with that width.
I've already tried changing the minimum width of the TextView to 0 after initializing it, but that doesn't solve the problem. The funny thing is if I enter text that is wider than the hint-text (forcing it to grow), it will shrink if I take away characters from that text until it gets back to the width that the hint-text forced it to have. What I want is for it to always shrink to the width of the text, regardless of the width of the hint-text.
Here's my layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:id="#+id/month_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="mm"
android:textColorHint="#color/hint_color"
android:singleLine="true"
android:textSize="40sp"
android:maxLength="2"/>
<TextView
android:id="#+id/first_hypen_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="-"
android:singleLine="true"
android:textSize="40sp"/>
<TextView
android:id="#+id/day_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="dd"
android:textColorHint="#color/hint_color"
android:singleLine="true"
android:textSize="40sp"
android:maxLength="2"/>
<TextView
android:id="#+id/second_hyphen_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="-"
android:singleLine="true"
android:textSize="40sp"/>
<TextView
android:id="#+id/year_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="yyyy"
android:textColorHint="#color/hint_color"
android:singleLine="true"
android:textSize="40sp"
android:maxLength="4"/>
</LinearLayout>
What I ended up doing was to set the hint on the TextView to "" when it had text in it, and then resetting the hint to the original hint if all the text was ever deleted from it. This way, once text was entered, whatever settings were forcing the TextView to have a minimum width -- because of the initial hint-text width -- would be reconfigured after the new hint was set, and the new minimum TextView width set to 0 because of the new hint-text width (""); and if all the text was deleted the hint would still show as expected.
Use "ems" with hint length
e.g. In XML design
android:ems="2"
Here for you day_textview has hint "dd", it's length is 2 then android:ems="2"
OR, In custom code
TextView tvDay = (TextView) findViewById(R.id.day_textview);
tvDay.setEms(tvDay.getHint().length());
So "ems" it turns out refers to the size of the widest character, typically an "M", get it? So setting minEms to an integer value say 3, on an EditText or TextView should ensure it's at least 3 characters wide. You can set the maxEms as well.
The thing I understood from you is, you want a text with hint characters length width. When you enter more text than hint length then your text should shrink till that entered text length. And once it's done and you remove all the entered text then again it should take the same hint's length width size.
For that above information is given.
Test e.g.
Add in you XML layout:
<EditText
android:id="#+id/edtCheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:hint="abc"
android:maxLines="1"
android:text="I am an Android Developer" />
Add this to your activity:
EditText edt = (EditText) findViewById(R.id.edtCheck);
edt.setEms(3);//3 just for test
edt.setMaxEms(1000);//1000 just for test
Now run and check is it works exact for what you are looking.
I really cannot figure out why, but I am only able to get ellipsize working on maxLines=2 and more. I am displaying a few words of description and then a long string with no spaces.
This is how the TextView looks like:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#757575"
android:text="#string/gcm_not_registered"
android:maxLines="1"
android:ellipsize="end"
android:id="#+id/login_gcmRegistrationTextView"/>
I then programatically set a text to it, but depending on the maxLines limitation, I get two different results:
The only thing that changed was the maxLines, why isn't the line filled in the first picture as well?
There are two ways to fix it:
Try to change android:ellipsize="end" attribute to android:ellipsize="marquee".
Try to remove android:maxLines="1" android:ellipsize="end" attributes and add android:singleLine="true" attribute.
This code works for me:
In the xml add:
Attribute ellipsize: marquee
Attribute lines: 1
In java:
<yourTextView>.setHorizontallyScrolling(true);
<yourTextView>.setSelected(true);
If there is another item that request the "focus" you lose the marquee effect. The textView need the state selected to prevent this.
Actually the problem is with the spannable text, if you set spannable text this wouldn't work. Other than this below code works for me
<TextView
android:id="#+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40dp"
android:layout_margin="5dp"
android:padding="5dp"
android:fontFamily="sans-serif-condensed"
android:textColor="#b3277b"
android:background="#f7ecff"
android:layout_below="#id/tv"
android:text="This is first line\nThis is second line\nThis is third line"
android:ellipsize="end"
android:maxLines="2"
/>
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"/>
Deprecated:
Add one more property android:singleLine="true" in your Textview
Updated:
android:ellipsize="end"
android:maxLines="1"
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).
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:
android:maxLines
android:singleLine (Note this and this)
android:lines
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="start" (...aaabbbccc)
ellipsize="middle" (aaa...ccc)
android: Ellipsise , meaning of the options
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:
Marquee text in Android
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.
Try this property of TextView in your layout file..
android:ellipsize="end"
android:maxLines="1"
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"
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"
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" />
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...
2) But when I used singleLine along with ellipsize -
android:ellipsize="end"
android:singleLine="true"
Check the bold TextViews Wyman Group, Jaskolski...
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.
Steps to add '...' at end of the text if it is too long:
check that the text width is constant
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" />
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...
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.
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.
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.
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.
<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"/>
I think you give fix height and width of text view. Then your solution will work.
you can write this line in xml where you take the textview :
android:singleLine="true"
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...
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.
Simple for three dots
android:layout_width="100dp" <!--your dp or match_parent or 0dp>
android:maxLines="2" <!--count your line>
android:ellipsize="end"
Add These two lines in your text
android:ellipsize="end"
android:singleLine="true"
you can do that by xml:
<TextView
android:id="#+id/textview"
android:maxLines="1" // or any number of lines you want
android:ellipsize="end"
/>
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);
}
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" />
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"
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>