Come aggiungere un'interruzione di linea in Android TextView?


157

Sto cercando di aggiungere un'interruzione di riga in TextView.

Ho provato a suggerire \ n ma non fa nulla. Ecco come imposto i miei messaggi.

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

Questa è la mia stringa: <string name="sample_string">some test line 1 \n some test line 2</string>

Dovrebbe mostrare così:

some test line 1
some test line 2

Ma dimostra in questo modo: some test line 1 some test line 2.

Mi sto perdendo qualcosa?


hai impostato android: linee su almeno 2?
Robby Pond,

il mio sottotitolo arriva già a 6-9 righe e avvolge il testo alla riga successiva ma se voglio romperlo non si rompe.
dropsOfJupiter

dovresti pubblicare la tua soluzione come risposta e accettarla, in modo che le persone possano votare!
bigstones,

1
Ho creato un piccolo progetto di esempio per illustrare i vari modi per codificare le interruzioni di riga e i loro effetti collaterali. Spoiler: \nè davvero il modo migliore. github.com/paour/StringResourceTest
Pierre-Luc Paour

Perché questa domanda è così votata? L'hai cercato? La soluzione è molto semplice, basta rimuovere quella Html.fromHtml()funzione e semplicemente usare txtSubTitle.setText(getResources().getString(R.string.sample_string)).
bug accadono

Risposte:


222

\n funziona per me, in questo modo:

<TextView android:text="First line\nNext line"

87
Funzionerà da \nsolo ... Non pensare che \rfaccia qualcosa.
Peter Ajtai,

5
\ r \ n è un'interruzione di linea per Windows e \ n è un'interruzione di linea per Linux
Guilherme Torres Castro,

non funziona per me <TextView android: layout_width = "50dp" android: layout_height = "70dp" android: layout_weight = "1" android: background = "@ drawable / keyboard1" android: gravity = "center" android: text = " 2 ABC "/>
AndroidRaji

1
Ingannevole per non aver menzionato l'altra modifica apportata che stava aggiungendo virgolette attorno alla stringa.
Patrick,

2
'\ r' mostra effettivamente come 'r' nel testo. Quindi, come altri hanno suggerito, '\ n' fa il trucco.
Miha Markic,

93

ok capito:

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

quindi è necessario avvolgere in CDATA e le interruzioni vengono aggiunte all'interno come tag html


3
Usa questo in una risorsa stringa & # xa; Come "Ciao! Prima riga! & # Xa; Questa è la seconda riga"
RexSplode

3
Ciò richiede l'utilizzo Html.fromHtml(), che è un po 'troppo per una semplice interruzione di riga e non è ben supportato dai fornitori di traduzioni.
Pierre-Luc Paour,

Andiamo amico, sul serio? Non hai trovato il problema nella sua domanda?
Bugs Happen

68

La versione 1.6 di Android non riconosce \ r \ n. Utilizzare invece: System.getProperty ("line.separator")

String s = "Line 1"
           + System.getProperty ("line.separator")
           + "Line 2"
           + System.getProperty ("line.separator");

3
Upvote! Questo ha funzionato per me! Se vuoi solo aggiungere un'interruzione di riga nel modulo: textView.setText (string1 + System.getProperty ("line.separator") + string2); allora funziona a meraviglia, grazie!
Due volte in cerchio il

WAT? Esiste una versione Android con Windows?
maaartinus,

3
Per chiunque usi Xamarin questo è l'equivalente: Java.Lang.JavaSystem.LineSeparator ()
Steve

1
Perché non semplicemente System.lineSeparator ()?
George Z.

60

Le interruzioni di riga (\ n) funzionano solo se inserisci il valore della risorsa stringa tra virgolette come questo:

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

Non farà interruzioni di riga se lo metti senza virgolette come questo:

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

sì, è così facile.


3
volevo solo aggiungere che questa citazione funziona anche con caratteri speciali nelle risorse di stringa o con lingue come il greco o il russo ... (se riscontri problemi)
datayeah

1
Grazie, penso che usare le virgolette sia una soluzione migliore per mantenere la leggibilità per lunghi testi a più righe <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
L'uso delle virgolette ha altri effetti collaterali, come rendere gli spazi sempre significativi (senza virgolette, più spazi di una riga, come nei rientri, vengono compressi).
Pierre-Luc Paour,

33

Ho provato tutto quanto sopra, ho fatto alcune ricerche per conto mio risultando nella seguente soluzione per il rendering di caratteri di escape di avanzamento riga:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Utilizzando il metodo di sostituzione è necessario filtrare gli avanzamenti di riga di escape (ad es. '\\ n')

  2. Solo allora ogni istanza dei caratteri di escape '\ n' di avanzamento riga viene renderizzata nell'effettivo avanzamento riga

Per questo esempio ho usato un database noSQL per gli script di Google Apps (ScriptDb) con dati formattati JSON.

Cin cin: D


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

18

Questo ha funzionato per me

android:text="First \n Second"

2
Il tuo esempio sembra includere il testo in una risorsa di layout, che è un grande no-no (impossibile da localizzare).
Pierre-Luc Paour,

17

Ci sono due modi per aggirare questo. Se si utilizza la stringa come stringa non elaborata, è necessario utilizzare il carattere di nuova riga. Se lo usi come html, ad es. Analizzandolo con Html.fromString, la seconda variante è migliore.

1) carattere Newline \n

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

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

<string name="sample> This<br>is a sample</string>

6
Non l'ho sottovalutato ma penso che il tuo codice sia sbagliato, hai bisogno di "& lt; br>" invece di "<br>" non funzionerà poiché <è un simbolo riservato.
JPM,

<br>, <u>, <b>E <i>tag sono ammessi in risorse di tipo stringa senza scampo, e corretta applicazione da parte TextView.setText(resId). Sono spogliati se utilizzati Context.getString(resId), a meno che non siano avvolti in una CDATAsezione.
Pierre-Luc Paour,

16

Questo ha funzionato per me, forse qualcuno lo scoprirà utile:

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

11

Se si utilizza XML per dichiarare l'utilizzo di TextView android:singleLine = "false"o in Java, utilizzaretxtSubTitle.setSingleLine(false);


no che non ha funzionato. Ha qualcosa a che fare con Html.fromHtml () e le risorse di stringa?
dropsOfJupiter

@dropsOfJupiter: hai visto cosa sta restituendo la chiamata Html.fromHtml ()? Sarei curioso di assegnarlo a una stringa e guardarlo nel debugger.
slund

10

Android Studio 0.8.9 utilizzato. L'unico modo in cui ha funzionato per me è usare \n. Né che sposta con CDATA né <br>o <br />lavorato.



8

molto semplice: usa "\ n"

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

\ n corrisponde al carattere ASCII 0xA, che è 'LF' o avanzamento riga

\ r corrisponde al carattere ASCII 0xD, che è 'CR' o ritorno a capo

questo risale alle primissime macchine da scrivere, dove si poteva scegliere di fare solo un avanzamento riga (e digitare solo una riga in basso), oppure un avanzamento riga + ritorno a capo (che si sposta anche all'inizio di una riga)

su Android / java il \ n corrisponde a un ritorno a capo + avanzamento riga, poiché altrimenti "sovrascriveresti" solo la stessa riga


6

Prova a ricontrollare le tue localizzazioni. Possibile, stai provando a modificare un file (localizzazione), ma in realtà programma usando un altro, proprio come nel mio caso . La lingua di sistema predefinita è il russo, mentre provo a modificare la localizzazione inglese.

Nel mio caso, la soluzione di lavoro consiste nell'utilizzare "\ n" come separatore di riga:

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

4

Inoltre puoi aggiungere "&lt;br&#47;&gt;"invece di \ n.

È il codice HTML con escape per <br/>

E quindi puoi aggiungere testo a TexView:

articleTextView.setText(Html.fromHtml(textForTextView));

no, non la penso così. Android stamperà effettivamente quella sciocchezza. Provai. Funziona bene in HTML ma non qui, specialmente quando stai facendo Html.fromHTML ("la mia stringa dal file xml")
dropsOfJupiter

@drops - Non dimenticare toString ==> Html.fromHtml(textForTextView).toString()--- E poi puoi fare: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- In altre parole basta usare <br/>direttamente all'internofromHtml()
Peter Ajtai

&lt;br/>dovrebbe bastare per assicurarsi che le informazioni sullo stile non vengano rimosse. (basato sulla documentazione ufficiale)
jpmcosta,

3

Puoi anche usare l'Editor di stringhe di Android Studio, che genera automaticamente freni di linea e cose del genere ...


2

Come Html.fromHtmldeprecato ho semplicemente usato questo codice per ottenere String2 nella riga successiva.

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

Il modo più semplice per farlo è andare su valori / stringhe (nella cartella delle risorse)

Dichiara una stringa lì:

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

E nel tuo specifico file XML basta chiamare la stringa come

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

1

Ho trovato un altro metodo: è necessario aggiungere l' attributo " android: maxWidth =" 40dp " ". Certo, potrebbe non funzionare perfettamente, ma interrompe la linea.


1

\ n non funzionava per me. Sono stato in grado di risolvere il problema modificando l'xml in testo e creando la proprietà del testo della visualizzazione di testo come di seguito.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Speriamo che questo aiuti coloro che hanno detto che \ n non ha funzionato per loro.


Non sono convinto che questa sia una buona soluzione. Ci sono solo \npersonaggi nascosti lì dentro.
Almo

1

Sto leggendo il mio testo da un file, quindi ho adottato un approccio leggermente diverso, poiché l'aggiunta di \ n al file ha comportato la visualizzazione di \ n nel testo.

    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

Forse sei in grado di inserire lf nel testo, ma non viene visualizzato? Assicurati di avere un'altezza sufficiente per il controllo. Per esempio:

Corretta:

android:layout_height="wrap_content"

Potrebbe essere sbagliato:

android:layout_height="10dp"

0

Nel mio caso, ho risolto questo problema aggiungendo quanto segue:

android:inputType="textMultiLine"

Il tipo di input è per EditText, non per TextView
clauziere,

0

prova questo:

         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

Sento che è necessaria una risposta più completa per descrivere come funziona in modo più approfondito.

In primo luogo, se hai bisogno di una formattazione avanzata, controlla il manuale su come usare HTML nelle risorse di stringa .
Quindi è possibile utilizzare <br/>, ecc. Tuttavia, ciò richiede l'impostazione del testo mediante il codice.

Se è solo testo semplice, ci sono molti modi per sfuggire a un carattere di nuova riga (LF) nelle risorse di stringa statica .

Racchiudere la stringa tra virgolette doppie

Il modo più pulito è racchiudere la stringa tra virgolette doppie.
Questo renderà così lo spazio bianco interpretato esattamente come appare, non collassato.
Quindi puoi semplicemente usare newline normalmente in questo metodo (non usare il rientro).

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

Nota che alcuni personaggi richiedono una fuga speciale in questa modalità (come \").

Le seguenti sequenze di escape funzionano anche in modalità quotata.

Quando si utilizza una riga singola in XML per rappresentare stringhe a più righe

Il modo più elegante per sfuggire alla nuova riga in XML è con il suo punto di codice (10 o 0xA in esadecimale) usando la sua entità XML / HTML &#xA;o &#10;. Questo è il modo XML per sfuggire a qualsiasi personaggio .
Tuttavia, questo sembra funzionare solo in modalità quotata.

Un altro metodo è semplicemente quello di utilizzare \n, sebbene influisca negativamente sulla leggibilità, secondo me (poiché non è una sequenza di escape speciale in XML, Android Studio non la evidenzia).

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

Non includere una nuova riga o uno spazio bianco dopo nessuna di queste sequenze di escape, poiché verrà interpretato come spazio aggiuntivo.


-1

Usa l'interruzione di testo in questo modo (\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.