Come mantenere gli spazi alla fine e / o all'inizio di una stringa?


359

Devo concatenare queste due stringhe dai miei file di risorse / valore:

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

Lo faccio in questo modo:

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();

Ma gli spazi alla fine della prima stringa e all'inizio della seconda stringa sono scomparsi (quando viene mostrato il Toast) ...

Cosa dovrei fare ?

Immagino che la risposta sia da qualche parte qui in questo collegamento alla documentazione

o è qualcosa come usare &amp ;il carattere "&" ??


2
Ci sono alcune buone risposte, ma nessuna di esse funziona per me (vedi i miei commenti). La generosità è per ogni risposta che fornisce un modo per ottenere un carattere di spazio reale (U + 0020) come primo o ultimo carattere della risorsa stringa.
Thomas,

3
Nasty brutto androide :(
Vlad Spreys,

Risposte:


502

Anche se usi la formattazione delle stringhe, a volte hai ancora bisogno di spazi bianchi all'inizio o alla fine della stringa. In questi casi, né la fuga con \, né l' xml:spaceattributo aiutano. È necessario utilizzare l'entità HTML &#160;per uno spazio bianco.

Utilizzare &#160;per spazi bianchi non frangibili.
Utilizzare &#032;per spazio normale.


12
Questo tipo di funzionamento funziona, ma inserisce uno spazio non interrotto (U + 00A0) anziché uno spazio normale. Ciò può essere indesiderabile in alcune situazioni.
Thomas,

50
& # 160 non funziona ... l'editor XML dà un errore e non puoi costruire il progetto ... \ u0020 funziona bene!
jcamacho,

10
Devi aggiungere i due punti (;) alla fine.
user1010160

36
\ u0020 è generalmente la soluzione migliore. & # 032; richiede che tu analizzi html e in alcuni casi può essere casualmente ignorato senza
creare

5
Su Android Studio 3.2, distribuito su un emulatore API 25, ho usato &#032;e non ho riscontrato alcun errore di compilazione, ma il mio spazio era ancora ignorato. &#160;ha funzionato, ma non voglio uno spazio bianco indistruttibile. Voglio solo uno spazio normale. \u0020lavorato.
Heath Borders,

490

Ho riscontrato lo stesso problema. Volevo lasciare uno spazio vuoto alla fine di una stringa di risorse che rappresenta un nome di campo sullo schermo.

Ho trovato una soluzione su questo problema: https://github.com/iBotPeaches/Apktool/issues/124

Questa è la stessa idea suggerita da Duessi. Inserisci \u0020direttamente nell'XML per uno spazio che desideri conservare.

Esempio :

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

La sostituzione avviene al momento della creazione, quindi non influirà sulle prestazioni del tuo gioco.


funziona alla grande. mi chiedo qual è la differenza tra usarlo e & # 160;
sviluppatore Android il

3
@androiddeveloper, \ u indica un carattere Unicode come sequenza di escape (non un carattere Unicode direttamente nel file). & # nnn; indica un'entità html, il che significa che stai facendo affidamento sul fatto che la tua stringa xml venga analizzata html (è di default quando usata nelle viste di testo). Vedi w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Interessante, ma non sapevo che fosse di default. Vuoi dire che se uso "setText" sulla risorsa stringa, funzionerà allo stesso modo?
sviluppatore Android

@androiddeveloper Sì, l'ho appena confermato nel codice. Puoi avere entità html nel tuo file xml di stringhe e saranno convertite di default con setText (int resId). Esempio: <string name = "test"> T & # 160; S & # 160; T & # 160; </string>.
greg7gkb,

5
\u0020è SPAZIO del codice ASCII. Questa è stata la scelta migliore per il mio progetto poiché ho dovuto assicurarmi che fosse ASCII.
OneWorld,

138

Questa documentazione suggerisce che la quotazione funzionerà:

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

2
Garantisce<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek,

5
Piace più dell'uso dei caratteri Unicode! Grazie!
Sumit Anantwar,

2
Purtroppo alcuni strumenti di localizzazione, come Passolo, aggiungono automaticamente la barra prima del preventivo. E la stringa diventa questa: <string name = "my_str_spaces"> \ "Prima e dopo? \" </string>. Pertanto, queste citazioni vengono visualizzate nel testo. Quindi l'utilizzo di \ u0020 sembra essere migliore in questo caso.
Fox,

Non lo vedo menzionato da nessuna parte nella documentazione. Il più vicino che posso vedere è Enclose the entire string in double quotes ("This'll work", for example)dove discute di sfuggire a Single quote (').
Heath Borders,

Questo non funziona per me
James Riordan il

38

Uso semplicemente il codice UTF per lo spazio "\ u0020" nel file strings.xml.

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

funziona alla grande. (Android ama i codici UTF)


2
Questo ha funzionato per me, mentre la risposta accettata no.
Lancia,

1
C'è qualcosa di nuovo nella risposta esistente ?
user905686,

21

Questa domanda potrebbe essere vecchia, ma per ora il modo più semplice per farlo è aggiungere le virgolette. Per esempio:

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

funziona perfettamente. Basta circondare il testo desiderato con segni di quota "il tuo testo"
Tarun Kumar,

10

È possibile spaziare con larghezze diverse:

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

| SPAZIO | SPAZIO SOTTILE | SPAZIO PER CAPELLI | nessuno spazio |

visualizzazione:

inserisci qui la descrizione dell'immagine


8

Se vuoi davvero farlo come stavi facendo, penso che devi dirlo che lo spazio bianco è rilevante sfuggendolo:

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

Tuttavia, utilizzerei la formattazione delle stringhe per questo. Qualcosa di simile al seguente:

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

poi

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

1
La fuga con una barra rovesciata non funziona (almeno per me). L'uso di una stringa di formato è generalmente un'ottima soluzione, ma non sempre. Ad esempio, String.formatcausa molte allocazioni di memoria indesiderabili in un gioco.
Thomas,

fuggire dagli spazi (usando "\") non ha funzionato neanche per me.
sviluppatore Android il

La formattazione funziona solo se il testo è tutto visualizzato nello stesso stile. Nel mio caso le 2 cose che vengono unite sono audaci contro colori normali e diversi.

5

usa "" con il valore della risorsa stringa.

Esempio: "valore con spazi"

O

usa il codice \ u0020 per gli spazi.


4

Funzionando bene sto 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>

File 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();

Screenshot qui Immagine di Showing Working di questo codice


2

Un argomento può essere fatto per aggiungere lo spazio a livello di codice. Dato che questi casi saranno spesso usati nelle concatenazioni, ho deciso di fermare la follia e fare solo il vecchio + " " +. Avrei senso nella maggior parte delle lingue europee, vorrei dire.


1

Tutte le risposte qui non hanno funzionato per me. Invece, per aggiungere uno spazio alla fine di una stringa in XMLho fatto questo

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

0

Non ho idea di Android in particolare, ma sembra la solita gestione degli spazi bianchi XML: lo spazio bianco iniziale e finale all'interno di un elemento è generalmente considerato insignificante e rimosso. Prova 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>

Sfortunatamente, xml:spacesembra essere ignorato.
Thomas,

0

Questo potrebbe non rispondere effettivamente alla domanda (Come mantenere gli spazi bianchi in XML) ma potrebbe risolvere il problema sottostante con maggiore grazia.

Invece di fare affidamento solo sulle risorse XML, concatenare utilizzando le stringhe di formato. Quindi prima rimuovi gli spazi bianchi

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

E poi costruisci la tua stringa in modo diverso:

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

C'è anche la soluzione dell'uso CDATA. Esempio:

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

Ma in generale penso che \u0020sia abbastanza buono.


-1

Se hai bisogno di spazio allo scopo di concatenarlo in seguito con altre stringhe, puoi utilizzare l'approccio di formattazione delle stringhe per aggiungere argomenti alla definizione della stringa:

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

Quindi per formattare la stringa (ad es. Se hai un errore restituito dal server, altrimenti usa getString(R.string.string_resource_example)):

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

Che si traduce in:

Error: Server error message here

-6

Non funziona con xml: space = "preserv"

quindi l'ho fatto nel modo più veloce =>

Ho semplicemente aggiunto un + "" + dove ne avevo bisogno ...

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

2
Qual è il punto di usare le risorse se hai intenzione di mescolare alcuni letterali di stringhe Java?
Kristopher Johnson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.