Como manter os espaços no final e / ou no início de uma String?


359

Eu tenho que concatenar essas duas seqüências de caracteres dos meus arquivos de recurso / valor:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2"> flips !</string>

Eu faço assim:

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+total_flips+getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();

Mas os espaços no final da primeira corda e no início da segunda corda desapareceram (quando o Toast é mostrado) ...

O que devo fazer ?

Eu acho que a resposta está em algum lugar aqui neste link de documentação

ou é algo como usar &amp ;para o caractere "&" ??


2
Existem algumas boas respostas, mas nenhuma delas funciona para mim (veja meus comentários). A recompensa é para qualquer resposta que forneça uma maneira de obter um caractere de espaço real (U + 0020) como o primeiro ou o último caractere do recurso de string.
Thomas

3
Android desagradável desagradável :(
Vlad Spreys

Respostas:


502

Mesmo se você usar a formatação de string, às vezes você ainda precisará de espaços em branco no início ou no final da string. Para esses casos, nem escapar com \, nem xml:spaceatributo ajuda. Você deve usar a entidade HTML &#160;para um espaço em branco.

Use &#160;para espaço em branco inquebrável.
Use &#032;para espaço regular.


12
Este tipo de obras, mas insere um espaço não-quebra (U + 00A0) em vez de um espaço regular. Isso pode ser indesejável em algumas situações.
Thomas

50
& # 160 não funciona ... o editor xml apresenta um erro e você não pode criar o projeto ... \ u0020 funciona bem!
Jcamacho 29/07

10
Você precisa adicionar o ponto e vírgula (;) no final.
User1010160

36
\ u0020 é geralmente a melhor solução. & # 032; requer que você analisar HTML e pode ser ignorado de forma aleatória, em alguns casos, resultando em nenhum espaço
HaydenKai

5
No Android Studio 3.2, implantando em um emulador de API 25, usei &#032;e não recebi nenhum erro de compilação, mas meu espaço ainda era ignorado. &#160;funcionou, mas não quero um espaço em branco inquebrável. Eu quero apenas um espaço regular. \u0020trabalhou.
Heath Borders

490

Eu tive o mesmo problema. Eu queria deixar um espaço em branco no final de uma sequência de recursos representando um nome de campo na tela.

Encontrei uma solução para este relatório de problema: https://github.com/iBotPeaches/Apktool/issues/124

Essa é a mesma idéia que Duessi sugere. Insira \u0020diretamente no XML um espaço em branco que você gostaria de preservar.

Exemplo:

<string name="your_id">Score :\u0020</string>

A substituição é feita no tempo de compilação, portanto, não afetará o desempenho do seu jogo.


funciona bem. pergunto qual é a diferença entre usá-lo e & # 160;
desenvolvedor android

3
@androiddeveloper, \ u indica um caractere unicode como uma sequência de escape (não um caractere unicode diretamente no arquivo). & # nnn; indica uma entidade html, o que significa que você está confiando na análise de sua string xml (por padrão, quando usada nas exibições de texto). Veja w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Interessante, mas eu não sabia que é por padrão. Você quer dizer que se eu usar "setText" no recurso de string, ele funcionará da mesma maneira?
desenvolvedor android

@androiddeveloper Sim, acabei de confirmar isso no código. Você pode ter entidades html no seu arquivo xml de strings e elas serão convertidas por padrão com setText (int resId). Exemplo: <string name = "test"> T & # 160; S & # 160; T & # 160; </string>.
Greg7gkb

5
\u0020é o ESPAÇO do código ASCII. Essa foi a melhor escolha para o meu projeto, pois eu tinha que ter certeza de que era ASCII.
OneWorld 5/11

138

Esta documentação sugere que a citação funcione:

<string name="my_str_spaces">" Before and after? "</string>

2
Isso garante #<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek 16/01/2013

5
Assim mais do que usar caracteres unicode! Obrigado!
Sumit Anantwar

2
Infelizmente, algumas ferramentas de localização, como o Passolo, adicionam barra antes da cotação. E string torna-se esta: <string name = "my_str_spaces"> \ "Antes e depois? \" </string>. Portanto, essas aspas aparecem no texto. Portanto, usar \ u0020 parece ser melhor nesse caso.
Fox

Não vejo isso mencionado em nenhum lugar da documentação. O mais próximo que eu posso ver é Enclose the entire string in double quotes ("This'll work", for example)onde ele discute como escapar de um Single quote (').
Heath Borders

Isso não funciona para mim
James Riordan

38

Eu apenas uso o código UTF para o espaço "\ u0020" no arquivo strings.xml.

<string name="some_string">\u0020The name of my string.\u0020\u0020</string>

funciona bem. (O Android adora códigos UTF)


2
Isso funcionou para mim, onde a resposta aceita não.
Lance

11
Existe algo novo para a resposta existente ?
User905686

21

Essa pergunta pode ser antiga, mas a partir de agora a maneira mais fácil de fazer isso é adicionar aspas. Por exemplo:

<string name="Toast_Memory_GameWon_part1">"you found ALL PAIRS ! on "</string>
<string name="Toast_Memory_GameWon_part2">" flips !"</string>

isso funciona perfeitamente. Apenas cercam seu texto desejado com marcas quotaion "seu texto"
Tarun Kumar

10

É possível espaçar com larguras diferentes:

<string name="space_demo">|&#x20;|&#x2009;|&#x200A;||</string>

| ESPAÇO ESPAÇO FINO | ESPAÇO DO CABELO | sem espaço |

Visualização:

insira a descrição da imagem aqui


8

Se você realmente deseja fazer do jeito que estava fazendo, acho que precisa dizer que o espaço em branco é relevante ao escapar dele:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on\ </string>
<string name="Toast_Memory_GameWon_part2">\ flips !</string>

No entanto, eu usaria formatação de string para isso. Algo como o seguinte:

<string name="Toast_Memory_GameWon">you found ALL PAIRS ! on %d flips !</string>

então

String message_all_pairs_found = String.format(getString(R.string.Toast_Memory_GameWon), total_flips);

11
Escapar com uma barra invertida não funciona (pelo menos para mim). Usar uma string de formato é uma ótima solução em geral, mas nem sempre. Por exemplo, String.formatcausa muitas alocações de memória indesejáveis ​​em um jogo.
Thomas

escapar dos espaços (usando o "\") também não funcionou para mim.
desenvolvedor android

A formatação funciona apenas se o texto for exibido no mesmo estilo. No meu caso, as duas coisas que estão sendo unidas são em negrito vs. cores normais e diferentes.

5

use "" com o valor do recurso de sequência.

Exemplo: "valor com espaços"

OU

use o código \ u0020 para espaços.


4

Trabalhando bem, estou usando \ u0020

<string name="hi"> Hi \u0020 </string>
<string name="ten"> \u0020 out of 10  </string>
<string name="youHaveScored">\u0020 you have Scored \u0020</string>

Arquivo Java

String finalScore = getString(R.string.hi) +name+ getString(R.string.youHaveScored)+score+ getString(R.string.ten);
               Toast.makeText(getApplicationContext(),finalScore,Toast.LENGTH_LONG).show();

Captura de tela aqui Imagem da exibição Trabalhando com este código


2

Pode-se argumentar para adicionar o espaço programaticamente. Como esses casos serão frequentemente usados ​​em concatenações, decidi parar a loucura e apenas fazer o que é antigo + " " +. Isso fará sentido na maioria das línguas européias, eu diria.


1

Todas as respostas aqui não funcionaram para mim. Em vez disso, para adicionar um espaço no final de uma string, XMLeu fiz isso

<string name="more_store">more store<b> </b> </string>

0

Não tenho idéia do Android em particular, mas isso parece com o processamento usual de espaços em branco XML - os espaços em branco à esquerda e à direita dentro de um elemento geralmente são considerados insignificantes e removidos. Tente xml:space:

<string name="Toast_Memory_GameWon_part1" xml:space="preserve">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2" xml:space="preserve"> flips !</string>

Infelizmente, xml:spaceparece ser ignorado.
Thomas

0

Na verdade, isso pode não responder à pergunta (Como manter espaços em branco em XML), mas pode resolver o problema subjacente com mais facilidade.

Em vez de confiar apenas nos recursos XML, concatene usando seqüências de caracteres de formato. Então, primeiro remova os espaços em branco

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on</string>
<string name="Toast_Memory_GameWon_part2">flips !</string>

E então construa sua string de maneira diferente:

String message_all_pairs_found = 
      String.format(Locale.getDefault(), 
                    "%s %d %s", 
                    getString(R.string.Toast_Memory_GameWon_part1),
                    total_flips,
                    getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();

0

Há também a solução de usar CDATA. Exemplo:

<string name="test"><![CDATA[Hello          world]]></string>

Mas, em geral, acho que \u0020é bom o suficiente.


-1

Se você precisar do espaço com o objetivo de concatená-lo posteriormente com outras strings, poderá usar a abordagem de formatação de strings para adicionar argumentos à sua definição de strings:

<string name="error_">Error: %s</string>

Em seguida, para formatar a string (por exemplo, se você tiver um erro retornado pelo servidor, caso contrário, use getString(R.string.string_resource_example)):

String message = context.getString(R.string.error_, "Server error message here")

O que resulta em:

Error: Server error message here

-6

Não funciona com xml: space = "preserve"

então eu fiz da maneira mais rápida =>

Eu simplesmente adicionei um + "" + onde eu precisava ...

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+" "+total_flips+" "+getString(R.string.Toast_Memory_GameWon_part2);

2
Qual é o sentido de usar recursos, se você quiser apenas misturar alguns literais de string Java?
precisa
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.