Android, Wie kann ich die Breite von TextView begrenzen (und drei Punkte am Ende des Textes hinzufügen)?

317

Ich habe eine TextView, die ich Zeichen davon einschränken möchte. Eigentlich kann ich das tun, aber ich suche nach drei Punkten (...) am Ende der Zeichenfolge. Dieser zeigt, dass der Text fortgesetzt wurde. Dies ist mein XML, aber es gibt keine Punkte, obwohl es meinen Text einschränkt.

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

Antworten:

690

Veraltet:

Fügen Sie android:singleLine="true"Ihrer Textansicht eine weitere Eigenschaft hinzu

Aktualisiert:

android:ellipsize="end" 
android:maxLines="1"
Mohammed Azharuddin Shaikh
quelle
3
Brauche auf jeden Fall singleLine, als ich das gerade versucht habe. Auch wenn es veraltet heißt.
EGHDK
41
android: singleLine = "true" ist veraltet und hat schlimme Nebenwirkungen. Verwenden Sie stattdessen android: ellipsize = "end" und maxLine = "1"
Hamidreza Hosseinkhani
1
Was sind die "schlechten Nebenwirkungen" der Verwendung singleLine? Siehe auch: Ist das XML-Attribut singleLine in Android veraltet oder nicht?
Suragch
1
Übrigens, Android: MaxLines kann größer als 1 sein, wenn Sie wollen :)
Touré Holder
1
Hat jemand diese Meldung "W / StaticLayout: maxLineHeight sollte nicht -1 sein. MaxLines: 1 lineCount: 1">?
COLD ICE
157

Folgendes habe ich gelernt, indem ich mit verschiedenen Optionen herumgespielt habe, um a TextViewin eine einzelne Zeile zu zwingen (mit und ohne die drei Punkte).

Geben Sie hier die Bildbeschreibung ein

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

Dadurch wird der Text nur in eine Zeile gezwungen. Jeder zusätzliche Text wird ausgeblendet.

Verbunden:

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

Dadurch wird der nicht passende Text abgeschnitten, der Benutzer wird jedoch durch Hinzufügen eines Auslassungszeichens (der drei Punkte) darauf hingewiesen, dass der Text abgeschnitten wurde.

Verbunden:

ellipsize = "Festzelt"

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

Dadurch wird der Text automatisch über die Textansicht gescrollt. Beachten Sie, dass es manchmal im Code festgelegt werden muss:

textView.setSelected(true);

Angeblich android:maxLines="1"und android:singleLine="true"sollte im Grunde das Gleiche tun und da singleLine anscheinend veraltet ist, würde ich es vorziehen, es nicht zu verwenden, aber wenn ich es herausnehme, scrollt das Festzelt nicht mehr. Das Herausnehmen maxLineshat jedoch keinen Einfluss darauf.

Verbunden:

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

Auf diese Weise kann der Benutzer manuell scrollen, um die gesamte Textzeile anzuzeigen.

Suragch
quelle
Dies ist jedoch nur eine Ellipse am Ende jedes Wortes. Gibt es eine Möglichkeit, ... mitten in einem sehr langen Wort ohne Leerzeichen ... hinzuzufügen?
Tobias Reich
@TobiasReich, mir ist keine eingebaute Methode bekannt, um dies zu erreichen. Sie können Ihre eigenen mit Paint.measureText erstellen .
Suragch
Manchmal benötigen Sie möglicherweise die App: layout_constrainedWidth = "true" auch
Dan Crisan
80

Probieren Sie diese Eigenschaft von TextView in Ihrer Layoutdatei aus.

android:ellipsize="end"
android:maxLines="1"
Niranj Patel
quelle
31

Ich nehme an, Sie möchten die Breite auf eine Zeile beschränken und nicht auf Zeichen beschränken? Da dies singleLineveraltet ist, können Sie Folgendes zusammen verwenden:

android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
Muz
quelle
13

z.B. Sie können verwenden

android:maxLength="13"

Dadurch wird die Texview-Länge auf 13 begrenzt. Wenn Sie jedoch versuchen, 3 Punkte (...) hinzuzufügen, wird diese nicht angezeigt, da sie Teil der Textview-Länge ist.

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

     } else {

            userName = data;

    }
        textView.setText(userName);

ansonsten muss man verwenden

 android:maxLines="1"
Nayanesh Gupte
quelle
2
Sie sollten besser "\ u2026" anstelle von "..." verwenden
Zharro
Dies war nur ein Beispiel. Wenn ich Strings in Strings.xml setze, greife ich definitiv zu Unicodes. Gibt es einen bestimmten Grund, den Sie hier angeben möchten?
Nayanesh Gupte
2
Nee. Ich persönlich habe vor kurzem von der Existenz dieses Zeichen in der Unicode gelernt und beschlossen , dieses Wissen zu teilen;)
Zharro
6

Verwenden

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

So sieht mein volles TextViewaus:

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

Bild von <code> TextView </ code>

kyrylo_23
quelle
5

Ich verwende Horizonal Recyclerview.
1) Hier in CardView wird TextView bei Verwendung vertikal verzerrt

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

Überprüfen Sie die fett gedruckten TextViews Wyman Group, Jaskolski ... Geben Sie hier die Bildbeschreibung ein

2) Aber als ich singleLine zusammen mit ellipsize verwendet habe -

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

Überprüfen Sie die fett gedruckten TextViews Wyman Group, Jaskolski ... Geben Sie hier die Bildbeschreibung ein

Die 2. Lösung hat bei mir richtig funktioniert (mit singleLine). Außerdem habe ich in OS-Version 4.1 und höher (bis 8.0) getestet, es funktioniert gut ohne Abstürze.

Varad Mondkar
quelle
4

Code:

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

xml:

android:maxLines = "5"

z.B

In Matthäus 13 fragten die Jünger Jesus, warum er in Gleichnissen zu den Menschenmengen sprach. Er antwortete: "Es ist dir gegeben worden, die Geheimnisse des Himmelreichs zu kennen, aber ihnen ist es nicht gegeben worden."

Ausgabe: In Matthäus 13 fragten die Jünger Jesus, warum er in Gleichnissen zu den Menschenmengen sprach. Er antwortete: "Es wurde dir gegeben zu wissen ...

ruin3936
quelle
4

Ich habe das gewünschte Ergebnis mit

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

Der Trick ist, maxLines und minLines auf den gleichen Wert zu setzen ... und nicht nur android: lines = "2", mache den Trick nicht. Außerdem vermeiden Sie veraltete Attribute.

user1974433
quelle
4

Sie müssen Ihrem Layout folgende Zeilen für die Textansicht hinzufügen

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

Hoffe das funktioniert bei dir.

Mayank Bhatnagar
quelle
3

Sie können die Anzahl der Zeichen in Ihrer Textansicht begrenzen und nach dem Text (...) hinzufügen. Angenommen, Sie müssen nur 5 Buchstaben anzeigen und danach müssen Sie (...) anzeigen. Gehen Sie einfach wie folgt vor:

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

}

ein kleiner Hack ^ _ ^. Obwohl es keine gute Lösung ist. Aber eine Arbeit, die für mich funktioniert hat: D.

BEARBEITEN: Ich habe die Prüfung auf weniger Zeichen gemäß Ihrer begrenzten Nr. Hinzugefügt. von Zeichen.

TheLittleNaruto
quelle
3

Um die Arbeit mit dem Android: ellipsize Attribute haben Sie die begrenzen Layoutbreite des Textview , so dass der Text aus der Sicht der Textview außerhalb der Grenzen ist.

Also, android: layout_width Attribut spielt eine wichtige Rolle, sie entsprechend eingestellt.

Ein Beispiel kann sein:

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

Nun, hier , wenn der Text in Android: text = „Dies ist ein sehr langer Text angezeigt wird“ geht aus der Sicht von Textview mit einem android: layout_width = „120dp“ , android: ellipsize = „end“ wird den gestutzt Text und platziere ... (3 Punkte) danach. dh das ist sehr lang ... wird in der Textansicht angezeigt.

Androwed
quelle
2

Ich denke, Sie geben feste Höhe und Breite der Textansicht. Dann wird Ihre Lösung funktionieren.

Vinay Kumar Baghel
quelle
2

Sie können diese Zeile in XML schreiben, wo Sie Folgendes nehmen textview:

android:singleLine="true"
Jay Thakkar
quelle
2

Der Ansatz von @AzharShaikh funktioniert gut.

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

Ich stelle jedoch fest, dass TextView (standardmäßig) wortweise abgeschnitten wird. Zeigen Sie, ob wir einen Text haben wie:

teste long_line_without_any_space_abcdefgh

Die Textansicht zeigt Folgendes an:

Prüfung...

Und ich habe eine Lösung gefunden, um dieses Problem zu lösen. Ersetzen Sie Leerzeichen durch das Unicode-Leerzeichen ohne Unterbrechung. Dadurch wird TextView Zeichen anstelle von Wörtern umbrechen:

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

Das Ergebnis:

test long_line_without_any_space_abc ...

Denken Sie zweimal an Code
quelle
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"/>
Kamran Rahmatullah
quelle
1

Fügen Sie diese beiden Zeilen in Ihren Text ein

android:ellipsize="end"
android:singleLine="true"
SANJAY GUPTA
quelle
0

Sie können das tun durch xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />
Khalid Taha
quelle
Wie kann ich 3 Dots@ end mit maxLength="35"Eigenschaft eine Lösung setzen?
Sagar
-1

Du änderst dich einfach ...

android:layout_width="wrap_content"

Verwenden Sie diese folgende Zeile

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>
KeTaN
quelle
singleLine ist veraltet
Nick