Android TextView Text wird nicht verpackt

77

Kann mir jemand sagen, was mit dem Text falsch läuft? Text, der länger als eine Zeile ist, wird nicht in die nächste Zeile umgebrochen, sondern geht über den Bildschirm hinaus.

Es folgt der Code:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:padding="4dip">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:padding="4dip">

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:orientation="horizontal" 
            android:padding="4dip">
            <TextView 
                android:id="@+id/reviewItemEntityName"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:text="event/venue" 
                android:textColor="@color/maroon"
                android:singleLine="true" 
                android:ellipsize="end" 
                android:textSize="14sp"
                android:textStyle="bold" 
                android:layout_weight="1" />

            <ImageView 
                android:id="@+id/reviewItemStarRating"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_alignParentBottom="true"
                android:src="@drawable/title_1_star" />
        </LinearLayout>

        <TextView 
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:text="Description comes here" 
            android:textSize="12sp" 
            android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>
D-Mann
quelle
12
Hinweis: Sie müssen nur xmlns:android="http://schemas.android.com/apk/res/android"das Element on root haben.
Jeremy Logan
In meinem Fall hatte ich eine sehr große Textansicht, in der eine Zahl angezeigt wurde, und sowohl über als auch unter dieser Zahl war ein beträchtlich großer Platz übrig. Mir wurde schnell klar, dass der Raum für andere Charaktere war. Die Textansicht scheint diesen Platz für Zeichen unter einer Zahl wie "2g" zu reservieren, wobei der untere Teil des "g" diesen unteren Platz verwenden würde.
Benjamin Basmaci

Antworten:

82

Ich habe es selbst repariert, der Schlüssel ist android:width="0dip"

<LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="4dip"
    android:layout_weight="1">

    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="4dip">

        <TextView
            android:id="@+id/reviewItemEntityName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/maroon"
            android:singleLine="true"
            android:ellipsize="end"
            android:textSize="14sp"
            android:textStyle="bold"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/reviewItemStarRating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentBottom="true" />
        </LinearLayout>

        <TextView
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:width="0dip" />

    </LinearLayout>

    <ImageView
        android:id="@+id/widget01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/arrow_nxt"
        android:layout_gravity="center_vertical"
        android:paddingRight="5dip" />

</LinearLayout> 

D-Mann
quelle
33
Eine bessere Verwendung android:layout_weight=1anstelle einer Breite von Null bedeutet, dass die Textansicht den verbleibenden Inhalt
ausfüllt
1
android: layout_weight = "1" funktioniert nicht auf meinem S3, aber android: width = "0dip" funktioniert? Das ist komisch. Irgendwelche Erklärungen?
Produktionscodierer
Wenn Sie GridLayout verwenden, möchten Sie columnWeight verwenden und es ist nur für Version 21 oder höher verfügbar.
Johnny Wu
Dies funktioniert gut, wenn ich Text Ende zu Ende in einer einzelnen Zeile setzen möchte. Was ist, wenn ich Text für mehr als 1 Zeile von Ende zu Ende setzen möchte? Wenn ich in der obigen Lösung android: singleLine = "false" setze, funktioniert die Lösung nicht
tejraj
39

Die einzig richtige Antwort auf diese Frage ist , dass Sie die Eltern auf eine geeignete Breite gesetzt (in diesem Fall FILL_PARENT, WRAP_CONTENT) und verwenden Sie android:layout_weight=1für die Textview , dass Bedürfnisse zu umwickeln.

SingleLine ist standardmäßig aktiviert, damit keine Änderungen vorgenommen werden.

Ein widthSatz auf 0px funktioniert, ist aber keine gute Lösung.

Ein Beispiel (diesmal in einer Tabellenansicht) mit xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">
    <TableLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:stretchColumns="*"
        android:id="@+id/tableLayout1">
        <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <TextView android:text="test1" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:layout_weight="0" />
            <TextView android:layout_weight="1"
                android:text="test2 very long text that needs to be wrapped properly using layout_weight property and ignoring singleline since that is set by default..."
                android:layout_width="fill_parent" android:layout_height="wrap_content" />
        </TableRow>     
    </TableLayout>
</LinearLayout>

Wenn Sie dies im Code festlegen möchten, suchen Sie das layout_weight als dritten Parameter wie in diesem Beispiel, in dem es auf 1 gesetzt ist:

row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
TextView label = new TextView(getApplicationContext());
label.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT, 1f));
hcpl
quelle
19

Sie müssen 2 Parameter verwenden:

  • android:ellipsize="none" : Der Text wird nicht auf die Breite der Textansicht zugeschnitten

  • android:scrollHorizontally="false" Der Text wird so viele Zeilen wie nötig umbrochen

Kartaguez
quelle
1
Ich fand in meinem Fall, dass ich android: maxLines = "X" zusammen mit diesen beiden hinzufügen musste. X ist eine beliebige Zahl (offensichtlich mehr als 1). Der Text wurde dann auf Android 2.3
Guykun
13

Es reicht aus, um in Ihrer XML-Datei zu verwenden.

android:singleLine="false".

Hoffe es wird funktionieren.

Alles Gute!

Dhasneem
quelle
10

Ich konnte keine dieser Lösungen zum Laufen bringen, wenn ich a TableLayout>TableRow>TextView. Ich habe dann gefunden TableLayout.shrinkColumns="*". Die einzige andere Lösung, die funktionierte, war das Erzwingen der Textansicht layout_width:250pxusw., aber ich mag es nicht, solche Breiten zu erzwingen.

Versuchen Sie so etwas, wenn Sie mit Tabellen arbeiten.

            <TableLayout 
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:shrinkColumns="*">

Beachten Sie, dass Sie benötigen shrinkColumns="*"

Dies ist offensichtlich innerhalb eines <LinearLayout>. Also so etwas wie<LinearLayout> <TableLayout> <TableRow> <TextView>

Verweise:

TableLayout

http://code.google.com/p/android/issues/detail?id=4000

Hoffe das hilft jemandem.

wired00
quelle
4

Einer Ihrer Layoutparameter ist in Ihrem Code falsch. In der ersten Textansicht

android:layout_width="wrap_content"

ändern

android:layout_width="fill_parent" 

Der Text außerhalb der Bildschirmbreite wird in die nächste Zeile umgebrochen und festgelegt android:singleline="false".

Marko
quelle
8
Ich denke, fill_parentwurde veraltet und ersetzt durch match_parent.
RCB
3

Stellen Sie die Höhe der Textansicht android:minHeight="some pixes"oder ein android:width="some pixels". Es wird das Problem lösen.

Chandra
quelle
3

Für meinen Fall hat das Entfernen des Eingabetyps den Trick gemacht. Ich habe android verwendet: inputType = "textPostalAddress", da meine Textansicht an einer Zeile klebte und nicht umbrochen wurde. Durch Entfernen dieses Eingabes wurde das Problem behoben.

iBabur
quelle
1

Ich bin ein Android (und GUI) Anfänger, habe aber viel Erfahrung mit Software. Ich habe einige der Tutorials durchgearbeitet, und dies ist mein Verständnis:

layout_width und layout_height sind Attribute der TextView. Sie sind Anweisungen, wie sich die Textansicht selbst formen soll. Sie beziehen sich nicht auf den Umgang mit dem Inhalt in der Textansicht.

Wenn Sie "fill_parent" verwenden, sagen Sie, dass sich die Textansicht relativ zur übergeordneten Ansicht selbst formen und füllen sollte.

Wenn Sie "wrap_content" verwenden, sollten Sie die übergeordnete Ansicht ignorieren und den Inhalt der Textansicht die Form definieren lassen.

Ich denke, das ist der verwirrende Punkt. "wrap_content" teilt der Textansicht nicht mit, wie der Inhalt verwaltet werden soll (um die Zeilen zu umbrechen), sondern weist an, dass sie sich relativ zum Inhalt selbst formen soll. In diesem Fall formt es sich ohne neue Zeilenzeichen so, dass sich der gesamte Text in einer einzelnen Zeile befindet (was leider über das übergeordnete Element hinausgeht).

Ich denke, Sie möchten, dass es das übergeordnete Element horizontal ausfüllt und den Inhalt vertikal umschließt.

Ben Horner
quelle
1

Obwohl dies ein alter Thread ist, möchte ich meine Erfahrungen teilen, da sie mir geholfen haben. Meine Anwendung funktionierte einwandfrei für OS 2.0 und 4.0+, aber für ein HTC-Telefon mit OS 3.x wurde der Text nicht umbrochen. Was für mich funktioniert hat, war, diese beiden Tags einzuschließen.

android:maxLines="100"
android:scrollHorizontally="false"

Wenn Sie beides eliminieren, funktionierte es nicht nur für das OS 3.0-Gerät. Der Parameter "Ellipsize" hatte einen neutralen Effekt. Hier ist das Volltext-Tag unten

<TextView
                android:id="@+id/cell_description"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:paddingTop="5dp"
                android:maxLines="100"
                android:scrollHorizontally="false"
                android:textStyle="normal"
                android:textSize="11sp"
                android:textColor="@color/listcell_detail"/>

Hoffe das würde jemandem helfen.

nsuinteger
quelle
1

Erhöhen Sie die Höhe dh. android: height = "Irgendeine Größe", es funktioniert gut für mich.

Phani Varma
quelle
1

Ich hatte ein ähnliches Problem, bei dem meine beiden horizontal gewichteten TextViews den Text nicht umschlossen. Ich fand später heraus, dass das Problem darin bestand, dass die Eltern meiner Ansichtselternteile wrap_content anstelle von match_parent hatten.

Supahfly
quelle
0

Ich denke, es hängt von der jeweiligen Kombination der Layouts in Ihrem Display ab. Einige Flags werden möglicherweise überschrieben oder ignoriert. Ich habe einen TabHost mit Registerkarten, jede Registerkarte ist eine Liste von Tabellen. Es ist also eine Registerkarte von ListView, wobei jede Zeile ein TableLayout von TextView ist. Ich habe die oben aufgeführten Korrekturen ausprobiert und keine davon hat funktioniert.

Likejudo
quelle
0

Ich weiß, dass es fraglich richtig ist, aber in meinem Fall bestand das Problem darin, die textSize-Eigenschaft in 'dp' festzulegen - ich habe sie in 'sp' geändert und sie funktioniert einwandfrei.

Krystian
quelle
0

In meinem Fall habe TableRow > ScrollView > TextViewich das Problem mit einer Verschachtelung gelöst, indem ich android:layout_widthauf fill_parenton TableRowund wrap_contenton ScrollViewund gesetzt habe TextView.

Janaka Bandara
quelle
0

Sie müssen android:singleLine="false"in ur TextViewTags verwenden.

Praveen
quelle
0

Ich habe es endlich geschafft, der Höhe der Textansicht einige Pixel hinzuzufügen, um dieses Problem zu lösen.

Zuerst müssen Sie tatsächlich die Höhe der Textansicht ermitteln. Es ist nicht einfach, weil es 0 ist, bevor es bereits gemalt ist.

Fügen Sie diesen Code zu onCreate hinzu:

mReceiveInfoTextView = (TextView) findViewById(R.id.receive_info_txt);
if (mReceiveInfoTextView != null) { 
    final ViewTreeObserver observer = mReceiveInfoTextView.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int height = mReceiveInfoTextView.getHeight();
            int addHeight = getResources().getDimensionPixelSize(R.dimen.view_add_height);
            mReceiveInfoTextView.setHeight(height + addHeight);

            // Remove the listener if possible
            ViewTreeObserver viewTreeObserver = mReceiveInfoTextView.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.removeOnGlobalLayoutListener(this);
            }
        }
    });
}

Sie müssen diese Zeile zu dimension.xml hinzufügen

<dimen name="view_add_height">10dp</dimen>

Ich hoffe es hilft.

Crubio
quelle
0

Ich habe es gerade entfernt android:lines="1"und hinzugefügt android:maxLines="2". Dadurch wurde der Text automatisch umbrochen. Das Problem war das android:linesAttribut. Dies führt dazu, dass der Textumbruch nicht ausgeführt wird .

Ich musste nicht maxEmsoder singleLine="false"(veraltete API) verwenden, um dies zu beheben.

Siddharth
quelle
0

Ich habe Stunden damit verbracht herauszufinden, dass der Text, den ich anzeigen wollte, ein einfaches Anführungszeichen (in string.xml) enthielt, also habe ich ihn nur mit einem Backslash maskiert und es hat gut funktioniert => Die Höhe der Textansicht hat den Text korrekt umbrochen ::

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-smallcaps"
        android:text="@string/instructions"
        android:textAlignment="center"
        android:textSize="18sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/keyword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/defaultKeyword"
        android:textSize="22sp"
        />
smasper
quelle
0

Ich verwende hauptsächlich das Einschränkungslayout.

1) android:layout_width="match_parent"= versucht sich zu dehnen, um Kanten zu treffen

2) android:layout_width="wrap_content"= basiert ausschließlich auf dem Eingabetext ohne Berücksichtigung anderer Ansichten in der Nähe. Durch Hinzufügen android:textAlignment="center"wird beispielsweise die Form des Texts geändert

3) android:padding="12dp" android:layout_width="0dp" android:layout_weight="1" android:singleLine="false"

= Der Text wird gefaltet, um nahegelegene Layouts ohne Rücksicht auf den Text selbst aufzunehmen

cagney
quelle
-1

Ich habe dieses Attribut gesetzt:

android:inputType="textMultiLine"

in meine TextView und es hat Zeilenumbruch und Benutzer kann für eine neue Zeile "Enter".

================================================== ==========

Wenn Sie zu diesem Beitrag kommen, möchten Sie möglicherweise eine große Textansicht erstellen, die mehrere Zeilen anzeigen kann, sodass diese Attribute möglicherweise auch benötigt werden

android:layout_height="Xdp" //where X is a number depends on how big Textview you want
android:gravity="top" //in order to make your text start from the top of your TextView.
Linh Lino
quelle
7
Dies ist für EditText, nicht für TextView.
Justin
-1

Ich habe android:ems="23"mein Problem gelöst. Ersetzen Sie einfach 23 durch den besten Wert in Ihrem Fall.

<TextView
        android:id="@+id/msg"
        android:ems="23"
        android:text="ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab "
        android:textColor="@color/white"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
Beto Caldas
quelle
-1

Ich habe ein \ n in die Mitte meiner Zeichenfolge eingefügt und es sah in Ordnung aus.

Yusuf X.
quelle
Dies ist nicht in allen Situationen der Fall. Betrachten Sie Situationen, in denen der Text dynamisch sein kann.
the_new_mr
-5

Um den Text zu umbrechen und den Text in die nächste Zeile einzufügen, verwenden wir das Zeichen "\ n", dh das neue Zeilenzeichen in der Layout-XML-Datei, und überprüfen Sie die Änderung auf dem Emulator und nicht auf dem Layoutbildschirm.

Anjali
quelle
3
Das heißt, die Linie nur an einem bestimmten Punkt zu brechen. Für das Umbrechen basierend auf der verfügbaren Bildschirmgröße (Ansichtsbreite) benötigen wir etwas anderes.
hcpl