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


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"

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


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");

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.


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.


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

18

Das hat bei mir funktioniert

android:text="First \n Second"

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>

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");

11

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


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.



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


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>

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));

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


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;
    }

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

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.


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.


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());

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"

0

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

android:inputType="textMultiLine"

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" );

0

Verwenden Sie einen Textumbruch wie folgt (\ n):

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

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.

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.