web-dev-qa-db-fra.com

Le caractère de nouvelle ligne\n ne s’affiche pas correctement dans textView Android

Je sais que si tu fais quelque chose comme

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

Ensuite, il s'affichera correctement comme ceci:

C'est en première ligne
Ceci est sur la deuxième ligne

Lorsque je stocke cette chaîne dans une base de données, puis la définit dans la vue, elle s'affiche comme telle:

Ceci est sur la première ligne\n Ceci est sur la deuxième ligne

Voici la ligne de code que j'utilise pour extraire la chaîne de la base de données:

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

Je remplis simplement la base de données à partir d'un fichier texte où chaque ligne est une nouvelle entrée dans le tableau afin qu'une ligne ressemble à ceci: "Ceci est sur la première ligne\n Ceci est sur la deuxième ligne" et elle est stockée sous forme de texte.

Y a-t-il une raison pour laquelle il n’affiche pas les caractères\n correctement? Ce doit être quelque chose à voir avec la chaîne étant dans la base de données. Aucune suggestion?

18
Mike

Comme Falmarri l'a dit dans son commentaire, votre chaîne est échappée lorsqu'elle est placée dans la base de données. Vous pouvez essayer de libérer la chaîne en appelant String s = unescape(stringFromDatabase) avant de la placer dans votre TextView.

En guise de remarque, assurez-vous que vous utilisez DatabaseUtils.sqlEscapeString() sur tout type de données provenant de l'utilisateur ou sur une source inconnue pouvant être modifiée lors de l'insertion de données dans la base de données. Cela vous protégera des erreurs et SQL Injection .

19
Austyn Mahoney

J'ai trouvé cette question. La réponse d'Austyn Mahoney est correcte, mais voici une petite aide:

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

description étant la chaîne issue de votre base de données SQLite

34
Blundell

Essayez \\n au lieu de \n. S'il lève une exception, utilisez le mot-clé newline à la place de\n .... newline a un caractère, ascii 10; il est souvent entré dans une chaîne de caractères ... et servira votre but .... :)

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

Le || concatène des chaînes et le x'0A' est une nouvelle ligne sans échappement. 

Si vous insérez des enregistrements, vous devrez remplacer chaque nouvelle ligne par "||x'0A'||" (si votre chaîne est entre guillemets). Cela peut sembler maladroit par rapport aux autres réponses. Toutefois, si vos lignes sont dans des colonnes séparées, cela fonctionne également dans une sélection:

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

J'ai trouvé cela tout en ayant le même problème que vous êtes: http://www.mail-archive.com/[email protected]/msg43557.html

1
Brendan Draper

Une zone de texte peut être en mode multiligne ou simple ligne. Lorsqu'il est en mode ligne unique, les caractères de nouvelle ligne '\ n' seront traités comme des espaces. En cas de doute, vous pouvez utiliser le code suivant pour activer le mode multiligne:

    setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_MULTI_LINE);

J'ai eu le problème que le même code ne fonctionnait pas sur les nids d'abeilles et froyo, qui semblent avoir des défauts différents. J'exclus également le drapeau lorsque je veux forcer un champ à une seule ligne.

Du doc ​​Android:

public static final int TYPE_TEXT_FLAG_MULTI_LINE Ajouté au niveau 3 de l'API

Indicateur pour TYPE_CLASS_TEXT: plusieurs lignes de texte peuvent être entrées dans le champ . Si cet indicateur n'est pas défini, le champ de texte sera Limité à une seule ligne. Valeur constante: 131072 (0x00020000)

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

Vous devez définir le drapeau avant de renseigner le champ.

0
j4n bur53