¿Cómo agregar un salto de línea en un Android TextView?


157

Estoy tratando de agregar un salto de línea en TextView.

Intenté sugerido \ n pero eso no hace nada. Así es como configuro mis textos.

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

Esta es mi cadena: <string name="sample_string">some test line 1 \n some test line 2</string>

Debería mostrarse así:

some test line 1
some test line 2

Pero muestra así: some test line 1 some test line 2.

¿Me estoy perdiendo de algo?


¿ha configurado android: lines en al menos 2?
Robby Pond

mi Subtítulo ya llega a 6-9 líneas y ajusta el texto a la siguiente línea, pero si quiero romperlo, no se rompe.
dropsOfJupiter

¡debe publicar su solución como respuesta y aceptarla, para que la gente pueda votar!
Bigstones

1
Creé un pequeño proyecto de muestra para ilustrar las diversas formas de codificar los saltos de línea y sus efectos secundarios. Spoiler: de \nhecho es la mejor manera. github.com/paour/StringResourceTest
Pierre-Luc Paour

¿Por qué esta pregunta es tan votada? ¿Lo buscaste en absoluto? La solución es muy simple, simplemente elimine esa Html.fromHtml()función y simplemente utilícela txtSubTitle.setText(getResources().getString(R.string.sample_string)).
errores suceden

Respuestas:


222

\n funciona para mí, así:

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

87
Solo \nsolo funcionará ... No pienses que \rhace nada.
Peter Ajtai

55
\ r \ n es un salto de línea para Windows, y \ n es un salto de línea para Linux
Guilherme Torres Castro

no funciona para mí <TextView android: layout_width = "50dp" android: layout_height = "70dp" android: layout_weight = "1" android: background = "@ drawable / keypad1" android: gravity = "center" android: text = " 2 ABC "/>
AndroidRaji

1
Engañoso por no mencionar el otro cambio que realizó que fue agregar comillas alrededor de la cadena.
Patrick

2
'\ r' en realidad se muestra como 'r' en el texto. Entonces, como otros sugirieron, '\ n' hace el truco.
Miha Markic

93

ok lo descubrí:

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

por lo que es necesario envolverlo en CDATA y se agregan saltos en el interior como etiquetas html


3
Use este en un recurso de cadena & # xa; Como "¡Hola! ¡Primera línea! & # Xa; Esta es la segunda línea"
RexSplode

3
Esto requiere el uso Html.fromHtml(), que es demasiado para un salto de línea simple, y no es bien compatible con los proveedores de traducción.
Pierre-Luc Paour

Vamos hombre, ¿en serio? ¿No pudo encontrar el problema en su pregunta?
errores suceden

68

Android versión 1.6 no reconoce \ r \ n. En su lugar, use: System.getProperty ("line.separator")

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

3
¡Votación a favor! ¡Esto funcionó para mí! Si solo desea agregar un salto de línea en la forma: textView.setText (string1 + System.getProperty ("line.separator") + string2); entonces funciona de maravilla, gracias!
Dos veces circulado el

WAT? ¿Existe una versión de Android con Windows?
maaartinus

3
Para cualquiera que use Xamarin, este es el equivalente: Java.Lang.JavaSystem.LineSeparator ()
Steve

1
¿Por qué no simplemente System.lineSeparator ()?
George Z.

60

Los saltos de línea (\ n) solo funcionan si coloca el valor de su recurso de cadena entre comillas como esta:

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

No hará saltos de línea si lo pones sin comillas como esta:

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

Sí, es así de fácil.


3
Solo quería agregar que estas citas también funcionan bien con caracteres especiales en recursos de cadena o con idiomas como el griego o el ruso ... (si encuentra algún problema)
datayeah

1
Gracias, creo que usar comillas es una mejor solución para mantener la legibilidad de textos largos de varias líneas <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
El uso de comillas tiene otros efectos secundarios, como hacer que los espacios sean siempre significativos (sin comillas, se colapsan varios espacios seguidos, como las sangrías).
Pierre-Luc Paour

33

Intenté todo lo anterior, hice algunas investigaciones por mi cuenta, lo que resultó en la siguiente solución para representar caracteres de escape de salto de línea:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Usando el método de reemplazo, necesita filtrar los saltos de línea escapados (por ejemplo, '\\ n')

  2. Solo entonces cada instancia de salto de línea '\ n' caracteres de escape se procesa en el salto de línea real

Para este ejemplo, utilicé una base de datos noSQL de Script de Google Apps (ScriptDb) con datos con formato JSON.

Saludos: D


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

18

Esto funciono para mi

android:text="First \n Second"

2
Parece que su ejemplo incluye el texto en un recurso de diseño, que es un gran no-no (imposible de localizar).
Pierre-Luc Paour

17

Hay dos formas de evitar esto. Si usa su cadena como cadena sin procesar, debe usar el carácter de nueva línea. Si lo usa como html, por ejemplo, analizándolo con Html.fromString, la segunda variante es mejor.

1) Carácter de nueva línea \n

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

2) etiqueta de nueva línea HTML <br>o<br />

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

66
No lo rechacé, pero creo que su código está equivocado, necesita "& lt; br>" en lugar de "<br>" no funcionará ya que <es un símbolo reservado.
JPM

<br>, <u>, <b>Y <i>las etiquetas están permitidas en recursos de cadena sin salida, y se aplican correctamente TextView.setText(resId). Se eliminan si se usan Context.getString(resId), a menos que estén envueltos en una CDATAsección.
Pierre-Luc Paour

16

Esto funcionó para mí, tal vez alguien lo encuentre útil:

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

11

Si está utilizando XML para declarar su uso de TextView android:singleLine = "false"o en Java, usetxtSubTitle.setSingleLine(false);


no, eso no funcionó. ¿Tiene algo que ver con Html.fromHtml () y los recursos de cadena?
dropsOfJupiter

@dropsOfJupiter: ¿has mirado lo que está devolviendo la llamada Html.fromHtml ()? Sería curioso asignarlo a una cadena y mirarlo en el depurador.
Slund

10

Usó Android Studio 0.8.9. La única forma en que funcionó para mí es usando \n. Ni envoltura con CDATA ni <br>o <br />trabajó.



8

muy fácil: usa "\ n"

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

\ n corresponde a ASCII char 0xA, que es 'LF' o avance de línea

\ r corresponde a ASCII char 0xD, que es 'CR' o retorno de carro

esto se remonta a las primeras máquinas de escribir, donde puede elegir hacer solo un avance de línea (y escribir solo una línea más baja), o un avance de línea + retorno de carro (que también se mueve al comienzo de una línea)

en Android / Java, el \ n corresponde a un retorno de carro + avance de línea, ya que de lo contrario simplemente 'sobrescribiría' la misma línea


6

Intenta verificar dos veces tus localizaciones. Posiblemente, intente editar un archivo (localización), pero en realidad programe usando otro, como en mi caso . El idioma predeterminado del sistema es el ruso, mientras intento editar la localización en inglés.

En mi caso, la solución de trabajo es usar "\ n" como separador de línea:

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

4

También puede agregar en "&lt;br&#47;&gt;"lugar de \ n.

Es código escapado HTML para <br/>

Y luego puede agregar texto a TexView:

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

Nea, no lo creo. Android realmente imprimirá ese sin sentido. Lo intenté. Funciona bien en HTML, pero no aquí, especialmente cuando está haciendo Html.fromHTML ("mi cadena del archivo xml")
dropsOfJupiter

@drops - No te olvides deString ==> Html.fromHtml(textForTextView).toString()--- Y luego puedes hacer: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- En otras palabras, solo usa <br/>directamente dentrofromHtml()
Peter Ajtai

&lt;br/>debería ser suficiente para asegurarse de que la información de estilo no se elimine. (basado en la documentación oficial)
jpmcosta

3

También puede usar el editor de cadenas de Android Studio, genera automáticamente frenos de línea y cosas así ...


2

Como en Html.fromHtmldesuso, simplemente usé este código para obtener String2 en la siguiente línea.

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

La forma más fácil de hacerlo es ir a valores / cadenas (en su carpeta de recursos)

Declara una cadena allí:

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

Y en su archivo xml específico simplemente llame a la cadena como

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

1

Encontré otro método: es necesario agregar el atributo " android: maxWidth =" 40dp " ". Por supuesto, puede que no funcione perfectamente, pero da un salto de línea.


1

\ n no estaba funcionando para mí. Pude solucionar el problema cambiando el xml a texto y construyendo la propiedad de texto de vista de texto como se muestra a continuación.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Esperemos que esto ayude a aquellos que han dicho que \ n no funcionó para ellos.


No estoy convencido de que esta sea una buena solución. Solo hay \npersonajes ocultos allí.
Almo

1

Estoy leyendo mi texto de un archivo, así que tomé un enfoque ligeramente diferente, ya que agregar \ n al archivo resultó en \ n aparecer en el texto.

    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

¿Quizás pueda poner el lf en el texto, pero no se muestra? Asegúrese de tener suficiente altura para el control. Por ejemplo:

Correcto:

android:layout_height="wrap_content"

Puede estar mal:

android:layout_height="10dp"

0

En mi caso, resolví este problema agregando lo siguiente:

android:inputType="textMultiLine"

El tipo de entrada es para EditText no TextView
clauziere

0

prueba esto:

         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

Siento que se necesita una respuesta más completa para describir cómo funciona esto más a fondo.

En primer lugar, si necesita un formato avanzado, consulte el manual sobre cómo usar HTML en los recursos de cadena .
Luego puede usar <br/>, etc. Sin embargo, esto requiere configurar el texto usando el código.

Si es solo texto sin formato, hay muchas formas de escapar de un carácter de nueva línea (LF) en los recursos de cadena estática .

Encerrando la cadena entre comillas dobles

La forma más limpia es encerrar la cadena entre comillas dobles.
Esto hará que el espacio en blanco se interprete exactamente como aparece, no colapsado.
Entonces puede simplemente usar nueva línea normalmente en este método (no use sangría).

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

Tenga en cuenta que algunos caracteres requieren un escape especial en este modo (como \").

Las secuencias de escape a continuación también funcionan en modo citado.

Cuando se usa una sola línea en XML para representar cadenas de varias líneas

La forma más elegante de escapar de la nueva línea en XML es con su punto de código (10 o 0xA en hexadecimal) utilizando su entidad XML / HTML &#xA;o &#10;. Esta es la forma XML de escapar de cualquier personaje .
Sin embargo, esto parece funcionar solo en modo citado.

Otro método es simplemente usar \n, aunque afecta negativamente la legibilidad, en mi opinión (dado que no es una secuencia de escape especial en XML, Android Studio no lo resalta).

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

No incluya una nueva línea ni ningún espacio en blanco después de ninguna de estas secuencias de escape, ya que eso se interpretará como espacio adicional.


-1

Use un salto de texto como este (\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.