2010-08-27 15 views
15

Sé que si haces algo comocarácter nueva línea n no se muestran correctamente en Textview Android

myTextView.setText("This is on first line \n This is on second line"); 

A continuación, se mostrará correctamente como esto:

Esto está en primera línea
Esto está en la segunda línea

Cuando almaceno esa cadena en una base de datos y luego la configuro a la vista, se muestra como tal:

Esto está en primera línea \ n Esto está en segunda línea

Aquí está la línea de código que utilizo para extraer la cadena a partir de la base de datos:

factView.setText(factsCursor.getString(MyDBAdapter.FACT_COLUMN)); 

simplemente pueblan la base de datos de un archivo de texto donde cada línea es una nueva entrada en la tabla para que una línea se vea así: "Esto está en la primera línea \ n Esto está en la segunda línea" y se almacena como texto.

¿Hay algún motivo por el que no se muestren los caracteres \ n correctamente? Debe ser algo relacionado con la cadena que está en la base de datos. ¿Alguna sugerencia?

+0

Su nueva línea probablemente se escapó cuando se lo ponga en la base de datos. Tienes que escaparte cuando lo recuperas. – Falmarri

+1

¿Cómo podría hacer eso? El \ n aparece en la vista de texto, así que no creo que sqlite lo esté eliminando. – Mike

Respuesta

16

Como dijo Falmarri en su comentario, su cadena se está escapando cuando se coloca en la base de datos. Puede intentar y deshacer la cadena llamando al String s = unescape(stringFromDatabase) antes de colocarlo en su TextView.

Como nota al margen, asegúrese de estar utilizando DatabaseUtils.sqlEscapeString() en cualquier tipo de datos que provengan del usuario o de una fuente desconocida que se pueda cambiar al insertar datos en la base de datos. Esto lo protegerá de errores y SQL Injection.

+0

La clase SQLiteDatabase no se ocupa de esto sola? – Andrew

+0

Han pasado 6 años desde su respuesta. ¿Sabes si hay una forma actual de hacer esto? Tengo caracteres Unicode procedentes de mi base de datos (por ejemplo, \ u2265) que ahora creo que se están escapando cuando se ponen en la base de datos. – Brian

1

Pruebe \\n en lugar de \n. Si arroja una excepción, use la palabra clave newline en lugar de \ n ... newline es un carácter, ascii 10; a menudo se ingresa en un literal de cadena ... y servirá a su propósito ... :)

+0

Supongo que quería rodear el \ n con espacio en blanco. Eso no funcionó. Estoy un poco confundido con lo que quieres decir con la nueva palabra clave de línea. No hubo excepción lanzada. – Mike

+0

He editado esta publicación para aclarar a qué se refería Rohan. – MatrixFrog

32

me encontré con esta pregunta la respuesta de Austyn Mahoney es correcta, pero aquí hay un poco de ayuda:

private String unescape(String description) { 
    return description.replaceAll("\\\\n", "\\\n"); 
} 

description siendo la cadena que sale de su SQLite DB

+0

cómo mostrar \ t [tab] en la vista de texto de la base de datos? –

+0

Gran hombre ... ¡Trabajando perfecto! –

0

Un área de texto puede estar en línea múltiple o individual modo línea Cuando está en modo de línea única, los caracteres de nueva línea '\ n' se tratarán como espacios. En caso de duda, para cambiar el modo de múltiples líneas en que puede utilizar el siguiente código:

setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 

que tenía el problema de que el mismo código no funcionaba en el panal y en Froyo, que parecen tener diferentes valores predeterminados. Ahora también excluyo la bandera cuando quiero forzar un campo para que tenga una sola línea.

Desde el doc Android:

public static final int TYPE_TEXT_FLAG_MULTI_LINE añadido en el nivel API 3

Bandera de TYPE_CLASS_TEXT: varias líneas de texto se pueden introducir en el campo . Si este indicador no está configurado, el campo de texto será limitado a una sola línea. Constante Valor: 131 072 (0x00020000)

http://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_FLAG_MULTI_LINE

usted tiene que fijar la bandera antes de llenar el campo.

+0

Intenté durante 30 minutos obtener mi TextView para mostrar las nuevas líneas y lo que finalmente funcionó fue eliminar el código anterior de mi aplicación. No estoy seguro de lo que debería ser, pero esta línea de código era lo único que me impedía usar "\ n" líneas nuevas. –

+0

Podría ser que funcione sin establecer la bandera. También lo hizo en mi caso en algunas plataformas. Pero establecer la bandera no debe convertir su vista de texto en una sola línea. Debe haber algo más mal. –

1
"This is on first line"||x'0A'||"This is on second line" 

Los || concatena cadenas y la x'0A' es una nueva línea sin escapar.

Si está insertando registros, deberá reemplazar cada nueva línea con "||x'0A'||" (si su cadena está entre comillas dobles). Esto puede parecer torpe en comparación con las otras respuestas. Sin embargo, si sus líneas están en columnas separadas Esto también funciona en un selecto:

SELECT firstline||x'0A'||secondline FROM wherever; 

me encontré con esto mientras que tienen el mismo problema son: http://www.mail-archive.com/[email protected]/msg43557.html

+0

el código ascii de nueva línea es 10, el siguiente código es correcto SELECCIONAR firstline || x'0A '|| secondline FROM anywhere; – jasonhao

+1

En su respuesta tiene 2 diffs: A0 y 0A: ¿cuál es el correcto? – jimpanzer

Cuestiones relacionadas