Wie füge ich einen Zeilenumbruch in eine Android TextView ein?

157

Ich versuche, einen Zeilenumbruch in die Textansicht einzufügen.

Ich habe versucht, vorgeschlagen \ n, aber das macht nichts. So stelle ich meine Texte ein.

TextView txtSubTitle = (TextView)findViewById(r.id.txtSubTitle);
txtSubTitle.setText(Html.fromHtml(getResources().getString(R.string.sample_string)));

Das ist mein String: <string name="sample_string">some test line 1 \n some test line 2</string>

Es sollte so aussehen:

some test line 1
some test line 2

Aber es zeigt sich so : some test line 1 some test line 2.

Vermisse ich etwas

Tropfen von Jupiter
quelle
hast du android: lines auf mindestens 2 gesetzt?
Robby Pond
Mein Untertitel hat bereits bis zu 6-9 Zeilen und der Text wird in die nächste Zeile umgebrochen, aber wenn ich ihn brechen möchte, bricht er nicht.
Tropfen von Jupiter
Sie sollten Ihre Lösung als Antwort veröffentlichen und akzeptieren, damit die Leute abstimmen können!
Bigstones
1
Ich habe ein kleines Beispielprojekt erstellt, um die verschiedenen Möglichkeiten zum Codieren von Zeilenumbrüchen und deren Nebenwirkungen zu veranschaulichen. Spoiler: \nist in der Tat der beste Weg. github.com/paour/StringResourceTest
Pierre-Luc Paour
Warum wird diese Frage so hoch gestimmt? Hast du es überhaupt nachgeschlagen? Die Lösung ist sehr einfach, entfernen Sie Html.fromHtml()einfach diese Funktion und verwenden Sie sie einfach txtSubTitle.setText(getResources().getString(R.string.sample_string)).
Bugs passieren

Antworten:

222

\n funktioniert für mich so:

<TextView android:text="First line\nNext line"
RonN
quelle
87
Nur \nalleine wird funktionieren ... Glaube nicht, dass das \rirgendetwas tut.
Peter Ajtai
5
\ r \ n es ist ein Zeilenumbruch für Windows, und \ n ist ein Zeilenumbruch für Linux
Guilherme Torres Castro
es funktioniert nicht für mich <TextView android: layout_width = "50dp" android: layout_height = "70dp" android: layout_weight = "1" android: background = "@ drawable / keypad1" android :vity = "center" android: text = " 2 ABC "/>
AndroidRaji
1
Irreführend, weil Sie die andere Änderung, die Sie vorgenommen haben und die Anführungszeichen um die Zeichenfolge hinzugefügt hat, nicht erwähnt haben.
Patrick
2
'\ r' wird im Text tatsächlich als 'r' angezeigt. Also, wie andere vorgeschlagen haben, macht '\ n' den Trick.
Miha Markic
92

ok habe es herausgefunden:

<string name="sample_string"><![CDATA[some test line 1 <br />some test line 2]]></string>

Daher ist ein Wrap in CDATA erforderlich, und Unterbrechungen werden als HTML-Tags hinzugefügt

Tropfen von Jupiter
quelle
3
Verwenden Sie diese in einer Zeichenfolgenressource & # xa; Wie "Hi! Erste Zeile! & # Xa; Dies ist die zweite Zeile"
RexSplode
3
Dies erfordert die Verwendung Html.fromHtml(), was für einen einfachen Zeilenumbruch etwas viel ist und von Übersetzungsanbietern nicht gut unterstützt wird.
Pierre-Luc Paour
Komm schon Mann, im Ernst? Sie konnten das Problem in seiner Frage nicht finden?
Bugs passieren
68

Android Version 1.6 erkennt \ r \ n nicht. Verwenden Sie stattdessen: System.getProperty ("line.separator")

String s = "Line 1"
           + System.getProperty ("line.separator")
           + "Line 2"
           + System.getProperty ("line.separator");
Eric JOYÉ
quelle
3
Upvote! Das hat bei mir funktioniert! Wenn Sie dem Formular nur einen Zeilenumbruch hinzufügen möchten: textView.setText (string1 + System.getProperty ("line.separator") + string2); dann funktioniert es ein Vergnügen, danke!
Zweimal eingekreist
WAT? Gibt es eine Android-Version unter Windows?
Maaartinus
3
Für jeden, der Xamarin verwendet, ist dies das Äquivalent: Java.Lang.JavaSystem.LineSeparator ()
Steve
1
Warum nicht einfach System.lineSeparator ()?
George Z.
60

Zeilenumbrüche (\ n) funktionieren nur , wenn Sie Ihren Zeichenfolgenressourcenwert in Anführungszeichen wie folgt setzen:

<string name="sample_string">"some test line 1 \n some test line 2"</string>

Es wird keine Zeilenumbrüche verursachen, wenn Sie es ohne solche Anführungszeichen setzen:

<string name="sample_string">some test line 1 \n some test line 2</string>

Ja, so einfach ist das.

datayeah
quelle
3
Ich wollte nur hinzufügen, dass dieses Zitat-Zeug auch gut mit Sonderzeichen in String-Ressourcen oder mit Sprachen wie Griechisch oder Russisch
funktioniert
1
Vielen Dank, ich denke, die Verwendung von Anführungszeichen ist eine bessere Lösung, um die Lesbarkeit für lange mehrzeilige Texte <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
aufrechtzuerhalten
1
Die Verwendung von Anführungszeichen hat andere Nebenwirkungen, z. B. das Festlegen von Leerzeichen (ohne Anführungszeichen werden mehrere Leerzeichen in einer Zeile, z. B. in Einrückungen, reduziert).
Pierre-Luc Paour
33

Ich habe alles oben Genannte versucht und selbst recherchiert, was zu der folgenden Lösung für das Rendern von Zeilenvorschub-Fluchtzeichen führte:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Mit der Methode replace Sie müssen Filter entkam Zeilenvorschübe (zB ‚\\ n‘)

  2. Erst dann wird jede Instanz der Zeilenvorschub-Escapezeichen '\ n' in den eigentlichen Zeilenvorschub gerendert

In diesem Beispiel habe ich eine Google Apps Scripting noSQL-Datenbank (ScriptDb) mit JSON-formatierten Daten verwendet.

Prost: D.

Robert
quelle
text.replace ("\\ n", System.getProperty ("line.separator"))
Mussa
18

Das hat bei mir funktioniert

android:text="First \n Second"
Aniruddha
quelle
2
Ihr Beispiel sieht so aus, als ob es den Text in einer Layoutressource enthält. Dies ist ein großes Nein-Nein (unmöglich zu lokalisieren).
Pierre-Luc Paour
17

Es gibt zwei Möglichkeiten, dies zu umgehen. Wenn Sie Ihre Zeichenfolge als Rohzeichenfolge verwenden, müssen Sie das Zeilenumbruchzeichen verwenden. Wenn Sie es als HTML verwenden, z. B. indem Sie es mit analysieren Html.fromString, ist die zweite Variante besser.

1) Zeilenumbruch \n

<string name="sample> This\nis a sample</string>

2) HTML Newline Tag <br>oder<br />

<string name="sample> This<br>is a sample</string>
Poitroae
quelle
6
Ich habe es nicht abgelehnt, aber ich denke, Ihr Code ist falsch. Sie benötigen "& lt; br>" anstelle von "<br>". Es funktioniert nicht, da <ein reserviertes Symbol ist.
JPM
<br>, <u>, <b>Und <i>Tags werden in String - Ressourcen ohne Flucht erlaubt, und durch korrekt angewendet werden TextView.setText(resId). Sie werden bei Verwendung abgestreift, sofern sie Context.getString(resId)nicht in einen CDATAAbschnitt eingewickelt sind .
Pierre-Luc Paour
16

Das hat bei mir funktioniert, vielleicht findet jemand dies hilfreich heraus:

TextView textField = (TextView) findViewById(R.id.textview1);
textField.setText("First line of text" + System.getProperty("line.separator") + "Linija 2");
Zeljko Ivanovic
quelle
11

Wenn Sie XML zum Deklarieren Ihrer TextView-Verwendung android:singleLine = "false"oder in Java verwenden, verwenden SietxtSubTitle.setSingleLine(false);

seltsamer Quark
quelle
nein das hat nicht funktioniert Hat es etwas mit Html.fromHtml () und String-Ressourcen zu tun?
Tropfen von Jupiter
@dropsOfJupiter: Haben Sie sich angesehen, was der Aufruf von Html.fromHtml () zurückgibt? Ich wäre neugierig, es einem String zuzuweisen und es im Debugger anzusehen.
Slund
10

Verwendet Android Studio 0.8.9. Der einzige Weg, der für mich funktioniert hat, ist die Verwendung \n. Weder mit CDATA verpacken noch <br>oder <br />funktioniert.

Maxim Berezovsky
quelle
8

Ich benutze folgendes:

YOUR_TEXTVIEW.setText("Got some text \n another line");
Carlo Matulessy
quelle
8

sehr einfach: benutze "\ n"

    String aString1 = "abcd";
    String aString2 = "1234";
    mSomeTextView.setText(aString1 + "\n" + aString2);

\ n entspricht dem ASCII-Zeichen 0xA, das 'LF' oder Zeilenvorschub ist

\ r entspricht dem ASCII-Zeichen 0xD, das 'CR' oder Wagenrücklauf ist

Dies stammt aus den ersten Schreibmaschinen, bei denen Sie nur einen Zeilenvorschub (und nur eine Zeile tiefer) oder einen Zeilenvorschub + Wagenrücklauf (der auch an den Zeilenanfang verschoben wird) auswählen können.

Unter Android / Java entspricht \ n einem Wagenrücklauf + Zeilenvorschub, da Sie sonst nur dieselbe Zeile "überschreiben" würden

Ronny Webers
quelle
6

Versuchen Sie, Ihre Lokalisierungen zu überprüfen. Möglicherweise versuchen Sie, eine Datei zu bearbeiten (Lokalisierung), programmieren aber tatsächlich mit einer anderen, genau wie in meinem Fall . Die Standardsystemsprache ist Russisch, während ich versuche, die englische Lokalisierung zu bearbeiten.

In meinem Fall besteht die Arbeitslösung darin, "\ n" als Zeilentrennzeichen zu verwenden:

    <string name="string_one">line one.
    \nline two;
    \nline three.</string>
Dr. Failov
quelle
4

Sie können auch "&lt;br&#47;&gt;"anstelle von \ n hinzufügen .

Es ist HTML-Code für <br/>

Und dann können Sie TexView Text hinzufügen:

articleTextView.setText(Html.fromHtml(textForTextView));
mobiledev Alex
quelle
Nein, glaube nicht. Android druckt diesen Unsinn tatsächlich. Ich habe es versucht. Es funktioniert gut in HTML, aber nicht hier, besonders wenn Sie Html.fromHTML ("meine Zeichenfolge aus XML-Datei")
ausführen
@drops - Vergessen Sie nicht, String ==> Html.fromHtml(textForTextView).toString()--- Und dann können Sie tun: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- Mit anderen Worten, verwenden Sie einfach <br/>direkt im InnerenfromHtml()
Peter Ajtai
&lt;br/>sollte ausreichen, um sicherzustellen, dass die Stilinformationen nicht entfernt werden. (basierend auf der offiziellen Dokumentation)
jpmcosta
3

Sie können auch den String-Editor von Android Studio verwenden, der automatisch Linienbremsen und ähnliches erzeugt ...

Tim
quelle
2

Als Html.fromHtmlveraltet habe ich einfach diesen Code verwendet, um String2 in der nächsten Zeile zu erhalten.

textView.setText(fromHtml("String1 <br/> String2"));

.

@SuppressWarnings("deprecation")
    public static Spanned fromHtml(String html){
        Spanned result;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
        } else {
            result = Html.fromHtml(html);
        }
        return result;
    }
Shylendra Madda
quelle
2

Der einfachste Weg, dies zu tun, besteht darin, zu Werten / Zeichenfolgen (in Ihrem Ressourcenordner) zu wechseln.

Deklarieren Sie dort eine Zeichenfolge:

    <string name="example_string">Line 1\Line2\Line n</string>

Und in Ihrer spezifischen XML-Datei rufen Sie einfach die Zeichenfolge wie auf

    <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_string" />
Fidan Gill
quelle
1

Ich habe eine andere Methode gefunden: Ist notwendig, um das Attribut " android: maxWidth =" 40dp " " hinzuzufügen . Natürlich funktioniert es möglicherweise nicht perfekt, aber es gibt einen Zeilenumbruch.

Meister
quelle
1

\ n hat nicht für mich gearbeitet. Ich konnte das Problem beheben, indem ich die XML-Datei in Text änderte und die Textansicht textview wie unten erstellte.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Hoffentlich hilft dies denen, die gesagt haben, dass \ n für sie nicht funktioniert hat.

Josh Greco
quelle
Ich bin nicht davon überzeugt, dass dies eine gute Lösung ist. Es gibt nur versteckte \nZeichen darin.
Almo
1

Ich lese meinen Text aus einer Datei, daher habe ich einen etwas anderen Ansatz gewählt, da das Hinzufügen von \ n zur Datei dazu führte, dass \ n im Text angezeigt wurde.

    final TextView textView = (TextView) findViewById(R.id.warm_up_view);
    StringBuilder sb = new StringBuilder();
    Scanner scanner = new Scanner(getResources().openRawResource(R.raw.warm_up_file));
    while (scanner.hasNextLine()) {
      sb.append(scanner.nextLine());
      sb.append("\n");
    }

    textView.setText(sb.toString());
Rich Vogt
quelle
0

Vielleicht können Sie das lf in den Text einfügen , aber es wird nicht angezeigt? Stellen Sie sicher, dass Sie genügend Höhe für die Steuerung haben. Beispielsweise:

Richtig:

android:layout_height="wrap_content"

Kann falsch sein:

android:layout_height="10dp"
Jarekczek
quelle
0

In meinem Fall habe ich dieses Problem gelöst, indem ich Folgendes hinzugefügt habe:

android:inputType="textMultiLine"
Elcio Cestari
quelle
Der Eingabetyp ist für EditText nicht TextView
clauziere
0

Versuche dies:

         TextView calloutContent = new TextView(getApplicationContext());
         calloutContent.setTextColor(Color.BLACK);
         calloutContent.setSingleLine(false);
         calloutContent.setLines(2);
         calloutContent.setText(" line 1" + System.getProperty ("line.separator")+"  line2" );
Bahman Rashidi
quelle
0

Verwenden Sie einen Textumbruch wie folgt (\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
Ashnet
quelle
0

Ich bin der Meinung, dass eine vollständigere Antwort erforderlich ist, um zu beschreiben, wie dies gründlicher funktioniert.

Wenn Sie eine erweiterte Formatierung benötigen, lesen Sie zunächst das Handbuch zur Verwendung von HTML in Zeichenfolgenressourcen .
Dann können Sie <br/>usw. verwenden. Dies erfordert jedoch das Festlegen des Texts mithilfe von Code.

Wenn es sich nur um einfachen Text handelt, gibt es viele Möglichkeiten, ein Zeilenumbruchzeichen (LF) in statischen Zeichenfolgenressourcen zu umgehen .

Einschließen der Zeichenfolge in doppelte Anführungszeichen

Am saubersten ist es, die Zeichenfolge in doppelte Anführungszeichen zu setzen.
Dadurch wird das Leerzeichen so interpretiert, wie es angezeigt wird, und nicht reduziert.
Dann können Sie bei dieser Methode einfach Newline normal verwenden (keine Einrückung verwenden).

<string name="str1">"Line 1.
Line 2.
Line 3."</string>

Beachten Sie, dass einige Zeichen in diesem Modus ein spezielles Escapezeichen erfordern (z. B. \").

Die folgenden Escape-Sequenzen funktionieren auch im Anführungszeichenmodus.

Bei Verwendung einer einzeiligen XML-Datei zur Darstellung mehrzeiliger Zeichenfolgen

Der eleganteste Weg, um dem Zeilenumbruch in XML zu entkommen, ist der Codepunkt (10 oder 0xA in Hex) mithilfe der XML / HTML-Entität &#xA;oder &#10;. Dies ist die XML-Methode, um Zeichen zu umgehen .
Dies scheint jedoch nur im Anführungszeichenmodus zu funktionieren.

Eine andere Methode ist \nmeiner Meinung nach die einfache Verwendung , obwohl sie die Lesbarkeit negativ beeinflusst (da es sich nicht um eine spezielle Escape-Sequenz in XML handelt, wird sie von Android Studio nicht hervorgehoben).

<string name="str1">"Line 1.&#xA;Line 2.&#10;Line 3."</string>
<string name="str1">"Line 1.\nLine 2.\nLine 3."</string>
<string name="str1">Line 1.\nLine 2.\nLine 3.</string>

Fügen Sie nach keiner dieser Escape-Sequenzen einen Zeilenumbruch oder ein Leerzeichen ein, da dies als zusätzlicher Leerzeichen interpretiert wird.

Geekley
quelle