Jak zachować spacje na końcu i / lub na początku ciągu znaków?


358

Muszę połączyć te dwa ciągi z moich plików zasobów / wartości:

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

Robię to w ten sposób:

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

Ale spacje na końcu pierwszego łańcucha i na początku drugiego łańcucha zniknęły (gdy pojawia się Toast) ...

Co powinienem zrobić ?

Wydaje mi się, że odpowiedź znajduje się gdzieś w tym linku do dokumentacji

czy jest to coś w rodzaju użycia &amp ;znaku „&”?


2
Istnieje kilka dobrych odpowiedzi, ale żadna z nich nie działa dla mnie (zobacz moje komentarze). Nagroda za każdą odpowiedź, która pozwala uzyskać prawdziwy znak spacji (U + 0020) jako pierwszy lub ostatni znak zasobu łańcucha.
Thomas

3
Paskudny paskudny android :(
Vlad Spreys,

Odpowiedzi:


502

Nawet jeśli używasz formatowania łańcucha, czasem nadal potrzebujesz białych znaków na początku lub na końcu łańcucha. W tych przypadkach ani pomoc \, ani xml:spaceatrybut nie pomaga. Należy użyć encji HTML &#160;jako spacji.

Użyj &#160;do nierozerwalnego białego znaku.
Użyj &#032;dla zwykłego miejsca.


12
Ten rodzaj działa, ale wstawia spację nierozdzielającą (U + 00A0) zamiast zwykłej spacji. W niektórych sytuacjach może to być niepożądane.
Thomas

50
& # 160 nie działa ... edytor xml wyświetla błąd i nie możesz zbudować projektu ... \ u0020 działa dobrze!
jcamacho

10
Na końcu musisz dodać średnik (;).
user1010160

36
Ogólnie rzecz biorąc, jest to lepsze rozwiązanie. & # 032; wymaga parsowania HTML i może być w niektórych przypadkach losowo ignorowany, co powoduje brak miejsca
HaydenKai

5
W Androidzie Studio 3.2 wdrażającym się w emulatorze API 25 użyłem &#032;i nie dostałem błędu kompilacji, ale moje miejsce było nadal ignorowane. &#160;działało, ale nie chcę nierozerwalnego białego znaku. Chcę tylko zwykłej przestrzeni. \u0020pracował
Heath Borders

489

Natrafiłem na ten sam problem. Chciałem pozostawić puste miejsce na końcu łańcucha zasobów reprezentującego nazwę pola na ekranie.

Znalazłem rozwiązanie tego raportu o problemie: https://github.com/iBotPeaches/Apktool/issues/124

To ten sam pomysł, który sugeruje Duessi. Wstaw \u0020bezpośrednio do pliku XML puste miejsce, które chcesz zachować.

Przykład:

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

Wymiana odbywa się w czasie kompilacji, dlatego nie wpłynie to na wydajność twojej gry.


działa świetnie. zastanawiam się, jaka jest różnica między używaniem a & # 160;
programista Androida

3
@ androiddeveloper, \ u wskazuje znak Unicode jako sekwencję zmiany znaczenia (nie znak Unicode bezpośrednio w pliku). & # nnn; wskazuje encję html, co oznacza, że ​​polegasz na analizowaniu łańcucha xml (domyślnie jest to używane w widokach tekstowych). Zobacz w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Ciekawe, ale nie wiedziałem, że to domyślnie. Masz na myśli to, że jeśli użyję „setText” w zasobie łańcucha, to zadziała tak samo?
programista Androida

@androiddeveloper Tak, właśnie to potwierdziłem w kodzie. Możesz mieć jednostki html w pliku xml ciągów i będą one domyślnie konwertowane przy pomocy setText (int resId). Przykład: <string name = "test"> T & # 160; S & # 160; T & # 160; </entry>.
greg7gkb

5
\u0020to SPACJA kodu ASCII. To był najlepszy wybór dla mojego projektu, ponieważ musiałem się upewnić, że to ASCII.
OneWorld,

138

Ta dokumentacja sugeruje, że cytowanie będzie działać:

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

2
Czy to gwarantuje<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek

5
Polub to bardziej niż używanie znaków Unicode! Dzięki!
Sumit Anantwar

2
Niestety niektóre narzędzia lokalizacyjne, takie jak Passolo, automatycznie dodają ukośnik przed cytatem. A ciąg staje się taki: <string name = "my_str_spaces"> \ "Przed i po? \" </entry>. Dlatego te cytaty pojawiają się w tekście. Więc użycie \ u0020 wydaje się w tym przypadku lepsze.
Fox

Nigdzie nie widzę tego wspomnianego w dokumentacji. Najbliżej widzę, Enclose the entire string in double quotes ("This'll work", for example)gdzie omawia ucieczkę Single quote (').
Heath Borders

To nie działa dla mnie
James Riordan

38

Po prostu używam kodu UTF dla miejsca „\ u0020” w pliku strings.xml.

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

działa świetnie. (Android uwielbia kody UTF)


2
To zadziałało dla mnie, gdy zaakceptowana odpowiedź nie.
Lance,

1
Czy jest coś nowego w istniejącej odpowiedzi ?
user905686,

21

To pytanie może być stare, ale jak na razie najłatwiej to zrobić, dodając znaki cudzysłowu. Na przykład:

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

to działa idealnie. Wystarczy otoczyć żądany tekst znakami „Twój tekst”
Tarun Kumar,

10

Istnieje możliwość spacji o różnych szerokościach:

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

| PRZESTRZEŃ | CIENKA PRZESTRZEŃ | PRZESTRZEŃ DO WŁOSÓW | brak miejsca |

Wyobrażanie sobie:

wprowadź opis zdjęcia tutaj


8

Jeśli naprawdę chcesz to zrobić tak, jak robiłeś to myślę, że musisz powiedzieć, że spacja jest istotna, unikając jej:

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

Jednak użyłbym do tego formatowania ciągów . Coś w stylu:

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

następnie

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

1
Ucieczka odwrotnym ukośnikiem nie działa (przynajmniej dla mnie). Korzystanie z ciągu formatu jest ogólnie świetnym rozwiązaniem, ale nie zawsze. Na przykład String.formatpowoduje wiele przydziałów pamięci, które są niepożądane w grze.
Thomas

ucieczka ze spacji (użycie „\”) też nie działała dla mnie.
programista Androida

Formatowanie działa tylko wtedy, gdy cały tekst jest wyświetlany w tym samym stylu. W moim przypadku dwie rzeczy są odważne w porównaniu do normalnych i różnych kolorów.

5

użyj „” z wartością zasobu ciągu.

Przykład: „wartość ze spacjami”

LUB

użyj spacji dla kodu.


4

Pracuję dobrze Używam \ u0020

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

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

Zrzut ekranu tutaj Obraz przedstawiający działanie tego kodu


2

Można argumentować za programowym dodaniem spacji. Ponieważ te przypadki będą często używane w konkatenacjach, postanowiłem zatrzymać szaleństwo i po prostu zrobić stare + " " +. Zrozumiałbym, że będą one miały sens w większości języków europejskich.


1

Wszystkie odpowiedzi tutaj nie działały dla mnie. Zamiast tego, aby dodać spację na końcu łańcucha, XMLzrobiłem to

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

0

W szczególności nie mam pojęcia o Androidzie, ale wygląda to jak zwykła obsługa białych znaków XML - wiodące i końcowe białe znaki w elemencie są ogólnie uważane za nieistotne i usuwane. Spróbuj 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>

Niestety xml:spacewydaje się być ignorowany.
Thomas

0

To może nie odpowiedzieć na pytanie (Jak zachować białe znaki w XML), ale może rozwiązać problem leżący u podstaw z wdziękiem.

Zamiast polegać tylko na zasobach XML, konkatenuj przy użyciu ciągów formatu. Najpierw usuń białe spacje

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

A następnie zbuduj swój łańcuch inaczej:

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

Istnieje również rozwiązanie polegające na użyciu CDATA. Przykład:

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

Ale ogólnie uważam, że \u0020jest wystarczająco dobry.


-1

Jeśli potrzebujesz miejsca do późniejszego powiązania go z innymi łańcuchami, możesz użyć metody formatowania łańcucha, dodając argumenty do definicji łańcucha:

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

Następnie w celu sformatowania ciągu (np. Jeśli serwer zwrócił błąd, w przeciwnym razie użyj getString(R.string.string_resource_example)):

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

Co skutkuje w:

Error: Server error message here

-6

Nie działa z xml: space = "preserve"

więc zrobiłem to najszybciej = =

Po prostu dodałem + „” + tam, gdzie go potrzebowałem ...

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

2
Po co w ogóle korzystać z zasobów, jeśli zamierzasz mieszać dosłowne napisy Java?
Kristopher Johnson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.