Como adicionar uma quebra de linha em um Android TextView?


157

Estou tentando adicionar uma quebra de linha no TextView.

Eu tentei sugerir \ n, mas isso não faz nada. Aqui está como eu defino meus textos.

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

Esta é a minha String: <string name="sample_string">some test line 1 \n some test line 2</string>

Deve mostrar assim:

some test line 1
some test line 2

Mas isso mostra assim: some test line 1 some test line 2.

Estou esquecendo de algo?


você definiu android: lines para pelo menos 2?
Robby Pond

meu subtítulo chega a 6-9 linhas e já envolve o texto na próxima linha, mas se eu quiser quebrá-lo, ele não quebra.
dropsOfJupiter

você deve postar sua solução como resposta e aceitá-la, para que as pessoas possam votar!
bigstones 21/03

1
Criei um pequeno projeto de amostra para ilustrar as várias maneiras de codificar quebras de linha e seus efeitos colaterais. Spoiler: \né realmente o melhor caminho. github.com/paour/StringResourceTest
Pierre-Luc Paour

Por que esta questão é tão votada? Você procurou? A solução é muito simples, basta remover essa Html.fromHtml()função e simplesmente usar txtSubTitle.setText(getResources().getString(R.string.sample_string)).
Erros acontecem

Respostas:


222

\n funciona para mim, assim:

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

87
Apenas \ntrabalho vontade sozinho ... não acho que o \rfaz nada.
precisa

5
\ r \ n é uma quebra de linha para as janelas, e \ n é uma quebra de linha para linux
Guilherme Torres Castro

não está funcionando para mim <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 10/10/12

1
Enganador por não mencionar a outra alteração que você fez, que foi adicionar aspas ao redor da string.
Patrick

2
'\ r' realmente aparece como 'r' no texto. Então, como outros sugeriram, '\ n' funciona.
Miha Markic

93

ok entendi:

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

então envolva CDATA é necessário e quebras adicionadas dentro como tags html


3
Use este em um recurso de string & # xa; Como "Oi! Primeira linha!" Esta é a segunda linha "
RexSplode 20/17

3
Isso requer o uso Html.fromHtml(), o que é um pouco demais para uma quebra de linha simples e não é bem suportado pelos provedores de tradução.
Pierre-Luc Paour

Vamos lá cara, sério? Você não encontrou o problema na pergunta dele?
Erros acontecem

68

A versão 1.6 do Android não reconhece \ r \ n. Em vez disso, use: System.getProperty ("line.separator")

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

3
Voto a favor! Isso funcionou para mim! Se você deseja adicionar apenas uma quebra de linha no formato: textView.setText (string1 + System.getProperty ("line.separator") + string2); então funciona um prazer, obrigado!
Duas vezes circulou

WAT? Existe uma versão do Android executando o Windows?
Maaartinus

3
Para qualquer um usando Xamarin este é o equivalente: Java.Lang.JavaSystem.LineSeparator ()
Steve

1
Por que não simplesmente System.lineSeparator ()?
George Z.

60

Quebras de linha (\ n) funcionam apenas se você colocar o valor do recurso de string entre aspas como este:

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

Não haverá quebra de linha se você o colocar sem aspas como esta:

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

sim, é assim tão fácil.


3
eu só queria acrescentar que esta citação-stuff também funciona bem com caracteres especiais em recursos de corda ou com línguas como o grego ou russo ... (se você encontrar quaisquer problemas)
datayeah

1
Obrigado, eu acho que o uso de aspas é uma melhor solução para manter a legibilidade por longos textos de várias linhas <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
O uso de aspas tem outros efeitos colaterais, como tornar os espaços sempre significativos (sem aspas, vários espaços em uma linha, como recuos, são recolhidos).
Pierre-Luc Paour 21/03/19

33

Tentei tudo isso acima, fiz algumas pesquisas, resultando na seguinte solução para renderizar caracteres de escape de avanço de linha:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Usando o método de substituição, você precisa filtrar as alimentações de linha com escape (por exemplo, '\\ n')

  2. Somente então cada instância dos caracteres de escape do feed de linha '\ n' é renderizada no feed de linha real

Neste exemplo, usei um banco de dados noSQL (ScriptDb) do Google Apps com dados formatados em JSON.

Saúde: D


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

18

Isso funcionou para mim

android:text="First \n Second"

2
Seu exemplo parece incluir o texto em um recurso de layout, que é um grande não-não (impossível de localizar).
Pierre-Luc Paour 21/03/19

17

Existem duas maneiras de contornar isso. Se você usar sua sequência como uma sequência bruta, precisará usar o caractere de nova linha. Se você usá-lo como html, por exemplo, analisando-o Html.fromString, a segunda variante é melhor.

1) Caractere de nova linha \n

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

2) tag de nova linha HTML <br>ou<br />

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

6
Não diminuí a votação, mas acho que seu código está errado, você precisa "& lt; br>" em vez de "<br>", não funcionará, pois <é um símbolo reservado.
JPM

<br>, <u>, <b>E <i>as tags são permitidos em recursos seqüência de caracteres sem escape, e são correctamente aplicado pelos TextView.setText(resId). Eles são removidos se estiverem em uso Context.getString(resId), a menos que sejam enrolados em uma CDATAseção.
Pierre-Luc Paour 21/03/19

16

Isso funcionou para mim, talvez alguém descubra isso útil:

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

11

Se você estiver usando XML para declarar seu uso do TextView android:singleLine = "false"ou em Java, usetxtSubTitle.setSingleLine(false);


não, isso não funcionou. Tem algo a ver com Html.fromHtml () e recursos de string?
dropsOfJupiter

@dropsOfJupiter: você já viu o que a chamada Html.fromHtml () está retornando? Eu ficaria curioso para atribuí-lo a uma String e examiná-lo no depurador.
slund 21/03

10

Usado Android Studio 0.8.9. A única maneira de trabalhar para mim é usar \n. Nem embrulhar com CDATA nem <br>ou <br />funcionou.



8

muito fácil: use "\ n"

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

\ n corresponde ao caractere ASCII 0xA, que é 'LF' ou avanço de linha

\ r corresponde ao ASCII char 0xD, que é 'CR' ou retorno de carro

isso remonta às primeiras máquinas de escrever, onde você pode optar por fazer apenas um avanço de linha (e digitar apenas uma linha mais baixa) ou um avanço de linha + retorno de carro (que também se move para o início de uma linha)

no Android / java, o \ n corresponde a um retorno de carro + alimentação de linha, caso contrário, você simplesmente 'substituirá' a mesma linha


6

Tente verificar suas localizações. Possível, você está tentando editar um arquivo (localização), mas na verdade programa usando outro, como no meu caso . O idioma padrão do sistema é o russo, enquanto eu estou tentando editar a localização em inglês.

No meu caso, a solução de trabalho é usar "\ n" como separador de linhas:

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

4

Você também pode adicionar em "&lt;br&#47;&gt;"vez de \ n.

É um código HTML escapado para <br/>

E então você pode adicionar texto ao TexView:

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

Não, acho que não. O Android realmente imprimirá esse absurdo. Eu tentei. Funciona bem em HTML, mas não aqui, especialmente quando você está executando o Html.fromHTML ("minha string do arquivo xml")
dropsOfJupiter

@drops - Não se esqueça de toString ==> Html.fromHtml(textForTextView).toString()--- E então você pode fazer: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- Em outras palavras, basta usar <br/>diretamente dentro defromHtml()
Peter Ajtai

&lt;br/>deve ser suficiente para garantir que as informações de estilo não sejam removidas. (com base na documentação oficial)
jpmcosta

3

Você também pode usar o Editor de Cordas do Android Studio, ele gera automaticamente freios de linha e coisas assim ...


2

Como Html.fromHtmlobsoleto, simplesmente usei esse código para obter String2 na próxima linha.

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

A maneira mais fácil de fazer isso é acessar valores / strings (na sua pasta de recursos)

Declare uma string lá:

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

E no seu arquivo xml específico, basta chamar a string como

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

1

Encontrei outro método: É necessário adicionar o atributo " android: maxWidth =" 40dp " ". Obviamente, pode não funcionar perfeitamente, mas dá uma quebra de linha.


1

\ n não estava funcionando para mim. Consegui corrigir o problema alterando o xml para texto e criando a propriedade de texto textview como abaixo.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Espero que isso ajude aqueles que disseram que \ n não funcionaram para eles.


Não estou convencido de que esta seja uma boa solução. Existem apenas \ncaracteres ocultos lá.
Almo

1

Como estou lendo meu texto de um arquivo, adotei uma abordagem um pouco diferente, pois adicionar \ n ao arquivo resultaria em \ n aparecendo no texto.

    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

Talvez você seja capaz de colocar o lf no texto, mas ele não é exibido? Verifique se você tem altura suficiente para o controle. Por exemplo:

Corrigir:

android:layout_height="wrap_content"

Pode estar errado:

android:layout_height="10dp"

0

No meu caso, resolvi esse problema adicionando o seguinte:

android:inputType="textMultiLine"

O tipo de entrada é para EditText e não TextView
clauziere 28/02

0

tente isto:

         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

Sinto que é necessária uma resposta mais completa para descrever como isso funciona de maneira mais completa.

Primeiramente, se você precisar de formatação avançada, consulte o manual sobre como usar HTML em recursos de string .
Então você pode usar <br/>, etc. No entanto, isso requer a configuração do texto usando o código.

Se for apenas texto sem formatação, existem várias maneiras de escapar de um caractere de nova linha (LF) em recursos de cadeia estática .

Incluindo a cadeia entre aspas duplas

A maneira mais limpa é colocar a sequência entre aspas duplas.
Isso fará com que o espaço em branco seja interpretado exatamente como parece, não recolhido.
Em seguida, você pode simplesmente usar a nova linha normalmente neste método (não use recuo).

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

Observe que alguns caracteres requerem escape especial neste modo (como \").

As seqüências de escape abaixo também funcionam no modo entre aspas.

Ao usar uma linha única em XML para representar cadeias de linhas múltiplas

A maneira mais elegante de escapar da nova linha em XML é com seu ponto de código (10 ou 0xA em hexadecimal) usando sua entidade XML / HTML &#xA;ou &#10;. Essa é a maneira XML de escapar de qualquer caractere .
No entanto, isso parece funcionar apenas no modo citado.

Outro método é simplesmente usar \n, embora afete negativamente a legibilidade, na minha opinião (como não é uma sequência de escape especial em XML, o Android Studio não a destaca).

<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ão inclua uma nova linha ou espaço em branco após qualquer uma dessas seqüências de escape, pois isso será interpretado como espaço extra.


-1

Use quebra de texto como esta (\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.