Android Word-Wrap EditText-Text


75

Ich habe versucht, mein EditText-Feld zum Zeilenumbruch zu bringen, kann es aber anscheinend nicht.

Ich habe mich bei der Entwicklung von Android-Anwendungen mit viel komplizierteren Problemen befasst, und dies scheint ein unkomplizierter Prozess zu sein.

Das Problem bleibt jedoch bestehen, und ich habe ein großes Textfeld, in das ich nur Text in einer Zeile eingeben kann. Fahren Sie geradeaus fort und scrollen Sie horizontal, wenn Sie Text eingeben.

Hier ist der XML-Code für das EditText-Objekt aus meiner Layoutdatei.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/myWidget48"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
 <ScrollView
    android:id="@+id/myScrollView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    >
    <LinearLayout
        android:id="@+id/widget37"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
    >

<EditText
        android:id="@+id/txtNotes"
        android:layout_width="300px"
        android:layout_height="120px"
        android:scrollbars="vertical"
        android:textSize="18sp"
        android:gravity="left"
        android:layout_marginTop="10dip"
        android:inputType="textCapSentences"
        >
    </EditText>
</LinearLayout>
</ScrollView>
</LinearLayout>

Antworten:


173

Ich habe nicht nur die Ursache des Problems gefunden, sondern auch die Lösung gefunden. Wenn android:inputTypeverwendet, muss textMultiLine verwendet werden, um die mehrzeilige Unterstützung zu aktivieren. Die Verwendung von inputType ersetzt außerdem den Code android:singleLine="false". Wenn Sie inputType verwenden, muss zum Wiederholen textMultiLine verwendet werden, oder das EditText-Objekt besteht nur aus einer Zeile ohne Zeilenumbruch.

Edit: Vielen Dank an Jacob Malliet für die weiteren guten Ratschläge dazu. Er schlug vor, die boolesche Eigenschaft scrollHorizontally auf false zu setzen 'android:scrollHorizontally="false"'.

Beispiel XML-Code:

<EditText
    android:id ="@+id/edtInput"
    android:layout_width ="0dip" 
    android:layout_height ="wrap_content" 
    android:layout_weight ="1" 
    android:inputType="textCapSentences|textMultiLine"
    android:maxLines ="4" 
    android:maxLength ="2000" 
    android:hint ="@string/compose_hint"
    android:scrollHorizontally="false" />

1
Was ich vermisst habe war Android: layout_width = "0dp"
Squeeish

3
Warum benutzt du android:layout_width ="0dip"? Es ist für mich unsichtbar, wie ich angenommen habe.
Francisco Romero

@ Error404 // es wird durch layout_weight="1"Attribut überschrieben . So könnte es in platziert werden LinearLayout.
Youngjae

1
Für diejenigen, die diese Lösung nicht zum Laufen bringen können, wickeln Sie sie einfach in ein lineares Layout ein (wie das OP, in das sie eingewickelt ist), und sie sollte einwandfrei funktionieren.
jrhee17

22

Ok ich es herausgefunden , Sie setzen müssen android:scrollHorizontally="false"für Ihre EditTextin Ihrem xml. Ich bin mir ziemlich sicher, dass das funktionieren sollte.


2
Fünf verschiedene Antworten, dies ist die einzige, die für mich funktioniert hat (neben dem schrecklichen Tisch, den ich nicht einmal ausprobiert habe)
Yuttadhammo

1
Das ist die Antwort. Keine Notwendigkeit Lines, minLines. maxLinesund android:scrollHorizontally="false"und inputTypekann es schaffen.
Youngjae

17

Angenommen, Sie möchten zuerst nur eine Zeile haben, dann erweitern Sie sie auf 5 Zeilen und Sie möchten maximal 10 Zeilen haben.

<EditText
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:id="@+id/etMessageBox"
   android:layout_alignParentLeft="true"
   android:layout_centerVertical="true"
   android:autoLink="all"
   android:hint="@string/message_edit_text_hint"
   android:lines="5"
   android:minLines="1"
   android:gravity="top|left"
   android:maxLines="10"
   android:scrollbars="none"
   android:inputType="textMultiLine|textCapSentences"/>

Durch Erhöhen können android:linesSie festlegen, wie viele Zeilen erweitert werden sollen.


14

Sie müssen Ihrem Edittext das folgende Attribut hinzufügen.

android:inputType="textMultiLine"

Wenn Sie die Höhe oder die Maxline von edittext auf einen bestimmten Wert festlegen, wird ein Bildlauf durchgeführt, wenn Sie viel Zeichen eingegeben haben.


10

Ich habe es herausgefunden. Die Linie,

android:inputType="textCapSentences"

war das Problem. Durch Hinzufügen dieser Zeile zu einem EditText-Objekt wird das Objekt zu einer einzelnen Zeile EditText und es werden keine Wörter umbrochen, oder ein Benutzer kann die Eingabetaste drücken, um einen Zeilenvorschub oder einen Wagenrücklauf in den EditText einzufügen.


2
Na dann, benutze einfach android:inputType="textCapSentences|textMultiLine"stattdessen. Dann beginnt Ihr EditText-Feld mit Großbuchstaben und ist mehrzeilig. Für mich geht das! Jetzt sehe ich, dass Sie das oben sowieso in einer separaten Antwort angegeben haben ...
Snark

6

Das Einschließen der gesamten Aktivität in die Bildlaufansicht und das Platzieren des folgenden Bearbeitungstextes in einem linearen Layout war für mich ein Zauber.

Der Bearbeitungstext würde sich vertikal durch Drücken der Eingabetaste scrollen, Code wie folgt

<EditText
    android:id="@+id/editText1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:ems="10"
    android:hint="Enter somehting"
    android:inputType="textMultiLine"
    android:maxLength="2000"
    android:maxLines="6"
    android:scrollHorizontally="false"
    android:scrollbars="vertical" > 

"Enter somehting": D Aber wen interessiert das?) #Typo
fWd82

1

Versuchen Sie dies, indem Sie die Schwerkraft nach oben | links ändern, was für mich zusammen mit der Textmultiline vom Eingabetyp funktioniert hat

<EditText
    android:layout_width="200dp"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:background="@color/color_red"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="top|left"
    android:inputType="textMultiLine|textCapSentences"
    android:lines="10"
    android:maxWidth="200dp"
    android:maxLength="200"
    android:maxLines="10"
    android:singleLine="false"
    android:textColor="@android:color/white"
    android:textSize="26sp" />

1
Bitte verwenden Sie top|startanstelle von top|leftfür RTL-Unterstützung.
Ohad Cohen


0

Stellen Sie auch die übergeordnete Layoutbreite , (Layout_width Eigenschaft) . Zum Beispiel layout_width = 250sp

Andernfalls wird EditText oder TextView nicht in die nächste Zeile umgebrochen, bis das Ende des mobilen Rahmens erreicht ist. Definieren Sie also die Layoutbreite


1
Eltern bedeutet, LinerLayout oder Tablelayout usw.
Victor

-1

Hinweis: Schritt 1 - Erstellen Sie eine benutzerdefinierte Klasse für EditTextwordWrap.

Android hat diese Eigenschaft nicht. Sie können jedoch alle unterbrochenen Zeichen durch ReplacementTransformationMethod ersetzen.

public class WordBreakTransformationMethod extends ReplacementTransformationMethod
{
    private static WordBreakTransformationMethod instance;
    private WordBreakTransformationMethod() {}

    public static WordBreakTransformationMethod getInstance()
    {
        if (instance == null)
        {
            instance = new WordBreakTransformationMethod();
        }
        return instance;
    }

    private static char[] dash = new char[] {'-', '\u2011'};
    private static char[] space = new char[] {' ', '\u00A0'};

    private static char[] original = new char[] {dash[0], space[0]};
    private static char[] replacement = new char[] {dash[1], space[1]};

    @Override
    protected char[] getOriginal()
    {
        return original;
    }

    @Override
    protected char[] getReplacement()
    {
        return replacement;
    }
}

Schritt 2 - Schreiben Sie in Aktivität den folgenden Code:

In Android:

myEditText.setTransformationMethod(WordBreakTransformationMethod.getInstance());

In Kotlin:

myEditText.setTransformationMethod= WordBreakTransformationMethod.getInstance

In XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <EditText
        android:id="@+id/myEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:inputType="textCapSentences|textMultiLine"
        android:scrollHorizontally="false" />
</LinearLayout>

-6
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/table"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="1"
    >  
     <TableRow
        android:id="@+id/newRow">
        <LinearLayout
             android:layout_width="fill_parent"
             android:orientation="vertical"
             android:layout_height="wrap_content"
             android:gravity="left"
             android:paddingBottom="10dip">
            <TextView  
                android:layout_width="fill_parent" 
                android:layout_height="wrap_content" 
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:text="Some Text"
            />
        </LinearLayout>
        </TableRow>

        <View
        android:layout_height="2dip"
        android:background="#FF909090" />

    <TableRow>
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="10dip">

    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"         
        android:text="Some Text"
        android:paddingBottom="5dip"
        />     
    <EditText 
        android:id="@+id/editbox"  
        android:layout_width="wrap_content" 
        android:layout_height="150px"
        android:gravity="top"   
        android:inputType="textFilter"
        android:scrollHorizontally="false"      
        />  

</RelativeLayout>
</TableRow>
<TableRow>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button 
        android:id="@+id/btnone"  
        android:layout_width="3dip" 
        android:layout_height="wrap_content"
        android:layout_margin="2dip"
        android:layout_weight="1"
        android:text="Btn"
        />          
    <Button 
        android:id="@+id/btntwo"  
        android:layout_width="3dip" 
        android:layout_height="wrap_content"
        android:layout_margin="2dip"
        android:layout_weight="1"
        android:text="Btn"
        />    
 </LinearLayout>
 </TableRow>
 </TableLayout>

3
Bitte geben Sie einige Details dieser Antwort
Mauricio Gracia Gutierrez
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.