2010-08-27 6 views
15

Je sais que si vous faites quelque chose commecaractère nouvelle ligne n ne pas afficher correctement dans textView Android

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

Ensuite, il affiche 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éfinissez sur la vue affichée comme telle:

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

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

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

Je peuple simplement la base de données à partir d'un fichier texte où chaque ligne est une nouvelle entrée dans la table afin qu'une ligne ressemble à ceci "Ceci est sur la première ligne \ n C'est sur la deuxième ligne" et il est stocké en tant que texte.

Y at-il une raison pour laquelle les caractères \ n ne sont pas affichés correctement? Cela doit être quelque chose à voir avec la chaîne qui se trouve dans la base de données. Aucune suggestion?

+0

Votre nouvelle ligne est probablement être échappé lors de la mise dans la base de données. Vous devez vous échapper quand vous le récupérez. – Falmarri

+1

Comment ferais-je cela? Le \ n apparaît dans la vue du texte, donc je ne pense pas que sqlite le supprime. – Mike

Répondre

16

Comme Falmarri a dit dans son commentaire, votre chaîne est échappée quand elle est mise dans la base de données. Vous pouvez essayer d'annuler la chaîne en appelant le String s = unescape(stringFromDatabase) avant de le placer dans votre TextView.

En note, assurez-vous que vous utilisez DatabaseUtils.sqlEscapeString() sur tout type de données provenant de l'utilisateur ou d'une source modifiable inconnue lors de l'insertion de données dans la base de données. Cela vous protégera contre les erreurs et SQL Injection.

+0

La classe SQLiteDatabase ne s'en occupe pas elle-même? – Andrew

+0

Cela fait 6 ans depuis votre réponse. Savez-vous s'il existe une façon actuelle de le faire? J'ai des caractères Unicode provenant de ma base de données (par exemple, \ u2265) que je crois maintenant être échappés quand mis dans la base de données. – Brian

1

Essayez \\n au lieu de \n. Si elle déclenche une exception, utilisez newline à la place de \ n .... newline est un caractère, ascii 10; il est souvent entré dans un littéral de chaîne ... et servira votre but .... :)

+0

Je suppose que vous vouliez entourer le \ n avec des espaces blancs. Cela n'a pas fonctionné. Je suis un peu confus sur ce que vous voulez dire en utilisant le mot-clé nouvelle ligne. Aucune exception n'a été levée. – Mike

+0

J'ai modifié ce post pour clarifier ce que Rohan voulait dire. – MatrixFrog

32

Je trouve cette question la réponse de Austyn Mahoney est correct, mais voici une petite aide:

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

description étant la chaîne sortant de votre SQLite DB

+0

comment afficher \ t [tab] dans textview de la base de données? –

+0

Grand homme ... Travail parfait !!! –

0

Une zone de texte peut être en ligne mono ou multi mode 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, pour passer en mode multi-ligne sur vous pouvez utiliser le code suivant:

setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 

J'ai eu le problème que le même code ne fonctionne pas sur les nids d'abeilles et sur froyo, qui semblent avoir différentes valeurs par défaut. J'exclus maintenant le drapeau quand je veux forcer un champ à être doublé.

De la doc Android:

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

Drapeau pour TYPE_CLASS_TEXT: plusieurs lignes de texte peuvent être entrées dans le terrain. Si ce drapeau n'est pas défini, le champ de texte sera contraint sur 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 remplir le champ.

+0

J'ai essayé pendant 30 minutes pour que mon TextView affiche les nouvelles lignes et ce qui a finalement fonctionné était de supprimer le code ci-dessus de mon application. Je ne suis pas sûr de ce qu'il devrait être, mais cette ligne de code était la seule chose qui m'empêchait d'utiliser "\ n" newlines. –

+0

Il se pourrait que cela fonctionne sans définir le drapeau. Il a également fait dans mon cas sur certaines plates-formes. Mais la définition du drapeau ne doit pas transformer votre textview en une seule ligne. Il doit y avoir quelque chose d'autre qui ne va pas. –

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

Les || Concatène et x'0A' est une nouvelle ligne non échappée.

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 comparé aux autres réponses. Toutefois, si vos lignes sont dans des colonnes séparées, cela fonctionne aussi dans une sélection:

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

Je trouve cela tout en ayant le même problème que vous: http://www.mail-archive.com/[email protected]/msg43557.html

+0

le code ASCII de nouvelle ligne est 10, le code suivant est correct SELECT première ligne || x'0A '|| secondline FROM where; – jasonhao

+1

Dans votre réponse, vous avez 2 diffs: A0 et 0A: ce qui est correct? – jimpanzer

Questions connexes