Comment ajouter un saut de ligne dans un TextView Android?


157

J'essaye d'ajouter un saut de ligne dans le TextView.

J'ai essayé suggéré \ n mais cela ne fait rien. Voici comment je règle mes textes.

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

Ceci est ma chaîne: <string name="sample_string">some test line 1 \n some test line 2</string>

Cela devrait apparaître comme ceci:

some test line 1
some test line 2

Mais il montre comme ceci: some test line 1 some test line 2.

Est-ce que je manque quelque chose?


avez-vous défini android: lignes sur au moins 2?
Robby Pond

mon sous-titre atteint déjà jusqu'à 6-9 lignes et il enveloppe le texte à la ligne suivante, mais si je veux le casser, il ne se brise pas.
dropsOfJupiter

vous devez publier votre solution en tant que réponse et l'accepter, afin que les gens puissent voter pour!
bigstones

1
J'ai créé un petit exemple de projet pour illustrer les différentes façons d'encoder les sauts de ligne et leurs effets secondaires. Spoiler: \nc'est en effet le meilleur moyen. github.com/paour/StringResourceTest
Pierre-Luc Paour

Pourquoi cette question est-elle si votée? Avez-vous cherché du tout? La solution est très simple, supprimez simplement cette Html.fromHtml()fonction et utilisez simplement txtSubTitle.setText(getResources().getString(R.string.sample_string)).
bugs se produisent

Réponses:


222

\n fonctionne pour moi, comme ceci:

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

87
Tout \nseul fonctionnera ... Ne pensez pas qu'il \rfait quoi que ce soit.
Peter Ajtai

5
\ r \ n c'est un saut de ligne pour Windows, et \ n est un saut de ligne pour Linux
Guilherme Torres Castro

cela ne fonctionne pas pour moi <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
Il est trompeur de ne pas mentionner l'autre modification que vous avez apportée, à savoir l'ajout de guillemets autour de la chaîne.
Patrick

2
«\ r» apparaît en fait comme «r» dans le texte. Ainsi, comme d'autres l'ont suggéré, «\ n» fait l'affaire.
Miha Markic

93

ok compris:

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

donc envelopper dans CDATA est nécessaire et des pauses ajoutées à l'intérieur comme balises html


3
Utilisez celui-ci dans une ressource de chaîne & # xa; Comme "Salut! Première ligne! & # Xa; Ceci est la deuxième ligne"
RexSplode

3
Cela nécessite une utilisation Html.fromHtml(), ce qui est un peu trop pour un simple saut de ligne et n'est pas bien pris en charge par les fournisseurs de traduction.
Pierre-Luc Paour

Allez mec, sérieusement? Vous n'avez pas trouvé le problème dans sa question?
bugs se produisent

68

La version 1.6 d'Android ne reconnaît pas \ r \ n. À la place, utilisez: System.getProperty ("line.separator")

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

3
Upvote! Cela a fonctionné pour moi! Si vous souhaitez simplement ajouter un saut de ligne sous la forme: textView.setText (string1 + System.getProperty ("line.separator") + string2); alors ça marche un régal, merci!
Deux fois encerclé

WAT? Existe-t-il une version Android exécutant Windows?
maaartinus

3
Pour quiconque utilise Xamarin, c'est l'équivalent: Java.Lang.JavaSystem.LineSeparator ()
Steve

1
Pourquoi pas simplement System.lineSeparator ()?
George Z.23

60

Les sauts de ligne (\ n) ne fonctionnent que si vous mettez votre valeur de ressource de chaîne entre guillemets comme ceci:

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

Il ne fera pas de sauts de ligne si vous le mettez sans guillemets comme ceci:

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

oui, c'est aussi simple que cela.


3
Je voulais juste ajouter que ce truc de citation fonctionne également très bien avec des caractères spéciaux dans les ressources de chaîne ou avec des langues comme le grec ou le russe ... (si vous rencontrez des problèmes)
datayeah

1
Merci, je pense que l'utilisation de guillemets est une meilleure solution pour maintenir la lisibilité des longs textes sur plusieurs lignes <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
L'utilisation de guillemets a d'autres effets secondaires, tels que rendre les espaces toujours significatifs (sans guillemets, plusieurs espaces dans une ligne, comme dans les retraits, sont réduits).
Pierre-Luc Paour

33

J'ai essayé tout ce qui précède, j'ai fait mes propres recherches, ce qui a abouti à la solution suivante pour le rendu des caractères d'échappement de saut de ligne:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. En utilisant la méthode de remplacement, vous devez filtrer les sauts de ligne échappés (par exemple '\\ n')

  2. Ce n'est qu'alors que chaque instance de caractères d'échappement de saut de ligne '\ n' est rendue dans le saut de ligne réel

Pour cet exemple, j'ai utilisé une base de données Google Apps Scripting noSQL (ScriptDb) avec des données au format JSON.

Acclamations: D


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

18

Cela a fonctionné pour moi

android:text="First \n Second"

2
Votre exemple semble inclure le texte dans une ressource de mise en page, ce qui est un grand non-non (impossible à localiser).
Pierre-Luc Paour

17

Il y a deux façons de contourner cela. Si vous utilisez votre chaîne comme chaîne brute, vous devez utiliser le caractère de nouvelle ligne. Si vous l'utilisez en html, par exemple en l'analysant avec Html.fromString, la deuxième variante est meilleure.

1) Caractère de nouvelle ligne \n

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

2) Balise de retour à la ligne HTML <br>ou<br />

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

6
Je n'ai pas voté contre mais je pense que votre code est faux, vous avez besoin de "& lt; br>" au lieu de "<br>" cela ne fonctionnera pas car <est un symbole réservé.
JPM du

<br>, <u>, <b>Et les <i>balises sont autorisées dans les ressources de chaîne sans évasion, et sont correctement appliquées par TextView.setText(resId). Ils sont dépouillés s'ils sont utilisés Context.getString(resId), sauf s'ils sont enveloppés dans une CDATAsection.
Pierre-Luc Paour

16

Cela a fonctionné pour moi, peut-être que quelqu'un trouvera cela utile:

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

11

Si vous utilisez XML pour déclarer votre utilisation de TextView android:singleLine = "false"ou en Java, utiliseztxtSubTitle.setSingleLine(false);


non cela n'a pas fonctionné. Cela a-t-il quelque chose à voir avec Html.fromHtml () et les ressources de chaîne?
dropsOfJupiter

@dropsOfJupiter: avez-vous regardé ce que renvoie l'appel Html.fromHtml ()? Je serais curieux de l'attribuer à une chaîne et de la regarder dans le débogueur.
slund

10

Utilisé Android Studio 0.8.9. La seule façon de travailler pour moi est d'utiliser \n. Ni emballage avec CDATA ni <br>ou <br />travaillé.



8

très simple: utilisez "\ n"

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

\ n correspond au caractère ASCII 0xA, qui est 'LF' ou saut de ligne

\ r correspond au caractère ASCII 0xD, qui est 'CR' ou retour chariot

cela remonte aux toutes premières machines à écrire, où vous pouviez choisir de ne faire qu'un saut de ligne (et taper juste une ligne plus bas), ou un saut de ligne + retour chariot (qui se déplace également au début d'une ligne)

sur Android / java, le \ n correspond à un retour chariot + saut de ligne, comme vous le feriez autrement simplement `` écraser '' la même ligne


6

Essayez de vérifier vos localisations. Possible, vous essayez d'éditer un fichier (localisation), mais en programme en utilisant un autre, comme dans mon cas . La langue par défaut du système est le russe, alors que j'essaie de modifier la localisation en anglais.

Dans mon cas, la solution de travail consiste à utiliser "\ n" comme séparateur de ligne:

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

4

Vous pouvez également ajouter "&lt;br&#47;&gt;"au lieu de \ n.

Il s'agit d'un code d'échappement HTML pour <br/>

Et puis vous pouvez ajouter du texte à TexView:

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

nea, ne le pense pas. Android imprimera réellement ce non-sens. J'ai essayé. Cela fonctionne bien en HTML mais pas ici, surtout quand vous faites Html.fromHTML ("ma chaîne de fichier xml")
dropsOfJupiter

@drops - N'oubliez pas toString ==> Html.fromHtml(textForTextView).toString()--- Et puis vous pouvez faire: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- En d'autres termes, utilisez simplement <br/>directement à l'intérieurfromHtml()
Peter Ajtai

&lt;br/>devrait suffire pour s'assurer que les informations de style ne sont pas supprimées. (basé sur la documentation officielle)
jpmcosta

3

Vous pouvez également utiliser l'éditeur de chaînes d'Android Studio, il génère automatiquement des freins de ligne et des trucs comme ça ...


2

Comme Html.fromHtmlobsolète, j'ai simplement utilisé ce code pour obtenir String2 dans la ligne suivante.

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

Le moyen le plus simple de le faire est d'accéder aux valeurs / chaînes (dans votre dossier de ressources)

Déclarez une chaîne ici:

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

Et dans votre fichier xml spécifique, appelez simplement la chaîne comme

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

1

J'ai trouvé une autre méthode: est nécessaire d'ajouter l' attribut " android: maxWidth =" 40dp " ". Bien sûr, cela peut ne pas fonctionner parfaitement, mais cela donne un saut de ligne.


1

\ n ne fonctionnait pas pour moi. J'ai pu résoudre le problème en changeant le xml en texte et en créant la propriété textview text comme ci-dessous.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Espérons que cela aide ceux qui ont dit que \ n ne fonctionnait pas pour eux.


Je ne suis pas convaincu que ce soit une bonne solution. Il n'y a que des \npersonnages cachés là-dedans.
Almo

1

Je lis mon texte à partir d'un fichier, j'ai donc adopté une approche légèrement différente, car l'ajout \ n au fichier entraînait l'apparition de \ n dans le texte.

    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

Peut-être êtes-vous capable de mettre le lf dans le texte, mais il ne s'affiche pas? Assurez-vous d'avoir suffisamment de hauteur pour le contrôle. Par exemple:

Correct:

android:layout_height="wrap_content"

Peut être faux:

android:layout_height="10dp"

0

Dans mon cas, j'ai résolu ce problème en ajoutant ce qui suit:

android:inputType="textMultiLine"

Le type d'entrée est pour EditText pas TextView
clauziere

0

essaye ça:

         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

Je pense qu'une réponse plus complète est nécessaire pour décrire plus en détail comment cela fonctionne.

Premièrement, si vous avez besoin d'un formatage avancé, consultez le manuel sur l'utilisation du HTML dans les ressources de type chaîne .
Ensuite, vous pouvez utiliser <br/>, etc. Cependant, cela nécessite de définir le texte à l'aide de code.

S'il ne s'agit que de texte brut, il existe de nombreuses façons d'échapper à un caractère de nouvelle ligne (LF) dans les ressources de chaînes statiques .

Mettre la chaîne entre guillemets

Le moyen le plus simple est de mettre la chaîne entre guillemets.
Cela fera en sorte que les espaces soient interprétés exactement comme ils apparaissent, et non réduits.
Ensuite, vous pouvez simplement utiliser la nouvelle ligne normalement dans cette méthode (n'utilisez pas l'indentation).

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

Notez que certains caractères nécessitent un échappement spécial dans ce mode (comme \").

Les séquences d'échappement ci-dessous fonctionnent également en mode guillemets.

Lors de l'utilisation d'une seule ligne en XML pour représenter des chaînes multilignes

Le moyen le plus élégant d'échapper à la nouvelle ligne en XML est d'utiliser son point de code (10 ou 0xA en hexadécimal) en utilisant son entité XML / HTML &#xA;ou &#10;. C'est la manière XML d'échapper à n'importe quel caractère .
Cependant, cela semble fonctionner uniquement en mode cité.

Une autre méthode consiste à utiliser simplement \n, bien que cela affecte négativement la lisibilité, à mon avis (puisqu'il ne s'agit pas d'une séquence d'échappement spéciale en XML, Android Studio ne la met pas en évidence).

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

N'incluez pas de nouvelle ligne ou d'espaces blancs après l'une de ces séquences d'échappement, car cela sera interprété comme un espace supplémentaire.


-1

Utilisez un saut de texte comme celui-ci (\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.