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 "&" ??

Hubert
fonte
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.

duessi
fonte
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.

DavGin
fonte
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>
Skywalker5446
fonte
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)

Jasen
fonte
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>
kyay
fonte
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

Andrey
fonte
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);
Jeremy Logan
fonte
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.

Bhupendra Joshi
fonte
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

Tarsbir Singh
fonte
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.

MPelletier
fonte
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>
toobsco42
fonte
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>
Pavel Minaev
fonte
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();
Skusku
fonte
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.

desenvolvedor android
fonte
-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
A coisa
fonte
-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);
Hubert
fonte
2
Qual é o sentido de usar recursos, se você quiser apenas misturar alguns literais de string Java?
precisa