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

Answers:


690

不推荐使用:

再增加一个属性 android:singleLine="true"在您的Textview中再

更新:

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

3
我刚尝试这样做时绝对需要singleLine。即使它说不推荐使用。
EGHDK

41
android:singleLine =“ true”已弃用,并且有不良副作用。使用android:ellipsize =“ end”和maxLine =“ 1”代替
Hamidreza Hosseinkhani 2014年

1
使用的“不良副作用”是singleLine什么?另请参阅:Android中是否已弃用xml属性singleLine?
Suragch '17

1
顺便说一句,安卓:MAXLINES可以大于1,如果你想:)
图雷持有人

1
有谁知道这个消息“ W / StaticLayout:maxLineHeight不应为-1。maxLines:1 lineCount:1“>?
COLD ICE

157

以下是我通过TextView尝试各种将a 强制为单行(带有和不带有三个点)的选项而学到的。

在此处输入图片说明

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

这样可以截断不适合的文本,但可以通过添加省略号(三个点)让用户知道该文本已被截断。

有关:

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"应该做基本上相同的事情,并且由于单行显然已弃用,所以我宁愿不使用它,但是当我将其取出时,选取框不再滚动。服用maxLines出并不影响它,但。

有关:

Horizo​​ntalScrollView与scrollHorizo​​ntally

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

这允许用户手动滚动以查看整个文本行。


但这只是每个单词结尾的省略号。有什么方法可以在very_long_word_without_whitespace ...中间添加...?
Tobias Reich

@TobiasReich,我不知道有一种内置的方式可以完成该任务。您可以使用Paint.measureText自己制作
Suragch

有时您可能还需要app:layout_constrainedWidth =“ true”
Dan Crisan


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”而不是“ ...”
Zharro 2015年

这只是一个例子。如果我将字符串放在Strings.xml中,那么绝对可以使用unicode。您要在这里输入任何特定原因吗?
Nayanesh Gupte

2
不。我个人最近了解到Unicode中存在此字符,因此决定分享此知识;)
Zharro 2015年

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

我正在使用Horizo​​nal Recyclerview。
1)在CardView中,使用时TextView垂直变形

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

检查Jaskolski的粗体TextViews Wyman组... 在此处输入图片说明

2)但是当我将singleLine与ellipsize一起使用时-

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

检查Jaskolski的粗体TextViews Wyman组... 在此处输入图片说明

第二个解决方案对我来说正常工作(使用singleLine)。我也已经在OS版本: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设置为相同的值...不仅是android:lines =“ 2”,也没有技巧。另外,您还要避​​免使用任何过时的属性。



3

您可以限制textview的字符数,并在文本后添加(...)。假设您只需要显示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

编辑: 根据您的有限编号,我添加了较少字符的检查。字符。



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:文本=“这是要显示一个很长的文本”从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"/>



-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已弃用
Nick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.