Il carattere della nuova riga \ n non viene visualizzato correttamente in Android testuale

So che se fai qualcosa del genere

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

Quindi verrà visualizzato correttamente in questo modo:

Questo è in prima linea
Questo è in seconda linea

Quando memorizzo quella stringa in un database e poi la imposto sulla vista visualizzata come tale:

Questo è in prima linea \ n Questo è in seconda linea

Ecco la riga di codice che uso per estrarre la stringa dal database:

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

Semplicemente compilo il database da un file di testo in cui ogni riga è una nuova entrata nella tabella in modo che una riga assomigli a “Questa è sulla prima riga \ n Questa è sulla seconda riga” e viene memorizzata come testo.

C’è un motivo per cui non visualizza correttamente i caratteri \ n? Deve essere qualcosa a che fare con la stringa che si trova nel database. Eventuali suggerimenti?

    Come ha detto Falmarri nel suo commento, la stringa viene salvata quando viene inserita nel database. Puoi provare a decodificare la stringa chiamando String s = unescape(stringFromDatabase) prima di metterlo nella tua TextView .

    Come nota a margine, assicurati di utilizzare DatabaseUtils.sqlEscapeString() su qualsiasi tipo di dati proveniente dall’utente o da una fonte mutevole sconosciuta quando inserisci dati nel database. Questo ti proteggerà da errori e SQL Injection .

    Ho trovato questa domanda la risposta di Austyn Mahoney è corretta ma ecco un piccolo aiuto:

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

    description è la stringa che esce dal tuo DB SQLite

    Prova \\n invece di \n . Se lancia un’eccezione che usare la parola chiave newline al posto di \ n …. newline è un carattere, ascii 10; è spesso inserito in una stringa letterale … e servirà al tuo scopo …. 🙂

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

    || concatena le stringhe e x'0A' è una nuova riga senza x'0A' .

    Se stai inserendo record dovrai sostituire ogni nuova riga con "||x'0A'||" (Se la tua stringa è doppia citazione). Questo può sembrare goffo rispetto alle altre risposte. Tuttavia se le tue linee sono in colonne separate questo funziona anche in una selezione:

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

    Ho trovato questo pur avendo lo stesso problema che sei: http://www.mail-archive.com/sqlite-users@sqlite.org/msg43557.html

    Un’area di testo può essere in modalità multi linea o singola linea. Quando è in modalità linea singola, i caratteri di nuova riga ‘\ n’ saranno trattati come spazi. In caso di dubbio, per triggersre la modalità multi linea è ansible utilizzare il seguente codice:

      setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 

    Ho avuto il problema che lo stesso codice non funzionava su honeycomb e su froyo, che sembrano avere diverse impostazioni predefinite. Ora sto escludendo anche il flag quando voglio forzare un campo a essere allineato su una riga.

    Dal documento Android:

    public static final int TYPE_TEXT_FLAG_MULTI_LINE Aggiunto nel livello API 3

    Contrassegna per TYPE_CLASS_TEXT: è ansible immettere più righe di testo nel campo. Se questo flag non è impostato, il campo di testo sarà vincolato a una singola riga. Valore costante: 131072 (0x00020000)

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

    Devi impostare la bandiera prima di popolare il campo.