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.