2016-07-13 6 views
2

Wenn in einem TextView die Länge des Wortes größer ist, als die Breite aufnehmen kann, wird der Text umgebrochen und in die nächste Zeile verschoben. Die Textansicht umschließt jedoch nicht ihre eigene Breite, obwohl auf der rechten Seite ein leerer Bereich vorhanden ist.Wie kann ein TextView seine Breite reduzieren, wenn Text umbrochen und in die nächste Zeile verschoben wird?

Wie kann ich das TextView reduzieren, wenn es den Text umschließt?

TextView not wrapping width

Hier ist die Textview:

<TextView 
    android:id="@+id/userMessageTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="50dp" 
    android:layout_marginRight="40dp" 
    android:layout_marginTop="2dp" 
    android:autoLink="web" 
    android:background="@drawable/textview_design" 
    android:padding="8dp" 
    android:text="some text" 
    android:textColor="#333333" 
    android:textSize="17sp" /> 

Und textview_design.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#EEEEEE" /> 
    <corners 
     android:radius="@dimen/chat_message_text_corner_radius" /> 
</shape> 
+0

Sind Sie mit 'android: layout_width = "wrap_content"'? – earthw0rmjim

+0

machen Sie Ihre 'android: layout_width = wrap_content' in Ihrem XML für' textView' – SripadRaj

+0

zeigen Sie Ihre XML-Datei für diese Textansicht – Vickyexpert

Antwort

0

Wie Sie in Ihrem exemple gesehen haben, kann die Textview perfekt seinen Inhalt wickeln, wenn es neue Zeilen (\n), um den Inhalt zu trennen.

Also die Lösung ist einfach, berechnen Sie, wo die neuen Zeilen sein sollten und fügen Sie sie in Ihre Zeichenfolge ein!

I nach der Methode measureText die Breite des aktuellen Textes zu berechnen. Wenn es kleiner als die maximale Breite ist, versuche ich, mehr Text auf der Linie hinzuzufügen. Wenn es die maxWidth erreicht, wird eine neue Zeile eingefügt!

String message = "This is a long message that will be displayed on multiple lines"; 
int textViewContentMaxWidth = 600; // you need to calculate that value, for me it was screenWidth - 40 dp (16dp margins on each side and 4 dp padding on each side) 

String[] sections = message.split(" "); 
String formattedMessage = ReplaceBreakWordByNewLines(sections, tv.getPaint(), textViewContentMaxWidth) 
tv.setText(formattedMessage); 

-

public static String ReplaceBreakWordByNewLines(String[] _texts, Paint _paint, int maxWidth) 
{ 
    String formattedText = ""; 

    String workingText = ""; 
    for (String section : _texts) 
    { 
     String newPart = (workingText.length() > 0 ? " " : "") + section; 
     workingText += newPart; 

     int width = (int)_paint.measureText(workingText, 0, workingText.length()); 

     if (width > maxWidth) 
     { 
      formattedText += (formattedText.length() > 0 ? "\n" : "") + workingText.substring(0, workingText.length() - newPart.length()); 
      workingText = section; 
     } 
    } 

    if (workingText.length() > 0) 
     formattedText += (formattedText.length() > 0 ? "\n" : "") + workingText; 

    return formattedText; 
} 
+0

Dies ist eine interessante Lösung. Nicht sicher, warum ich nicht daran gedacht habe. Wie auch immer, dieses Problem war vor vielen Projekten und ich habe nicht wirklich darüber nachgedacht. Funktioniert das für dich? Auch was ist textViewContentMaxWidth? – abhiank

+0

Auch haben Sie sich das angeschaut: (Teil der Unterstützung lib 26.0) http://androidkt.com/autosizing-textviews/ – abhiank

+0

Ich sah die Support-Bibliothek. Aber ich wollte, wie du, eine kleinere Textansicht haben, weil ich keinen Hintergrund haben wollte, um den gesamten Raum zu füllen. –

Verwandte Themen