Як зберегти пробіли в кінці та / або на початку рядка?


358

Я повинен з'єднати ці два рядки з моїх файлів ресурсів / значень:

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

Я роблю це так:

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

Але пробіли в кінці першого рядка та на початку другого рядка зникли (коли відображається Тост) ...

Що я повинен зробити ?

Я здогадуюсь, відповідь десь тут, у цьому посиланні на документацію

чи це щось на кшталт використання &amp ;символу "&" ??


2
Є кілька хороших відповідей, але жодна з них не працює на мене (див. Мої коментарі). Баунті - це будь-яка відповідь, яка забезпечує спосіб отримати реальний простірний символ (U + 0020) як перший або останній символ рядкового ресурсу.
Томас

3
Nasty противний андроїд :(
Влад Шпрейс

Відповіді:


502

Навіть якщо ви використовуєте форматування рядків, іноді вам все-таки потрібні пробіли на початку або в кінці рядка. У цих випадках не допомагає ні втеча \, ні xml:spaceатрибут. Ви повинні використовувати сутність HTML &#160;для пробілу.

Використовуйте &#160;для нерозривного пробілу.
Використовуйте &#032;для регулярного простору.


12
Цей вид працює, але він вставляє нерозривний простір (U + 00A0) замість звичайного простору. Це може бути небажаним у деяких ситуаціях.
Томас

50
& # 160 не працює ... редактор xml видає помилку, і ви не можете створити проект ... \ u0020 працює чудово!
jcamacho

10
Вам потрібно додати напівколонку (;) наприкінці.
користувач1010160

36
\ u0020, як правило, краще рішення. & # 032; вимагає розбору html і може бути випадково проігнорована в деяких випадках, що не має місця
HaydenKai

5
На Android Studio 3.2, що розгортається на емуляторі API 25, я використовував &#032;, і я не мав помилки в збірці, але мій простір все ще ігнорувався. &#160;працював, але я не хочу нерозривного пробілу. Я хочу просто звичайний простір. \u0020працювали.
Гейт Межі

489

Я зіткнувся з тим же питанням. Я хотів залишити порожнє в кінці рядка ресурсу, що представляє ім'я екранного поля.

Я знайшов рішення щодо цього звіту: https://github.com/iBotPeaches/Apktool/isissue/124

Це та сама ідея, яку пропонує Дюссі. Вставте \u0020безпосередньо в XML для порожнього, який ви хочете зберегти.

Приклад:

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

Заміна проводиться в час збирання, тому це не вплине на продуктивність вашої гри.


працює чудово. цікаво, яка різниця між його використанням та & # 160;
андроїд розробник

3
@androiddeveloper, \ u вказує символ унікоду як послідовність виходу (а не значок Unicode безпосередньо у файлі). & # nnn; вказує на html-сутність, що означає, що ви покладаєтесь на те, що ваш HTML-рядок буде розроблений html (він використовується за замовчуванням, коли використовується в текстових поданнях). Дивіться w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Цікаво, але я не знав, що це за замовчуванням. Ви маєте на увазі, що якщо я використовую "setText" на ресурсному рядку, він буде працювати так само?
андроїд розробник

@androiddeveloper Так, я щойно підтвердив це в коді. Ви можете мати html-об'єкти у своєму файлі XML-рядків, і вони будуть перетворені за замовчуванням у setText (int resId). Приклад: <string name = "test"> T & # 160; S & # 160; T & # 160; </string>.
greg7gkb

5
\u0020є ПРОСТІР коду ASCII. Це був найкращий вибір для мого проекту, оскільки я повинен був переконатися, що це ASCII.
OneWorld

138

Ця документація передбачає, що цитування спрацює:

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

2
Чи гарантує це<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek

5
Це більше, ніж використання символів unicode! Дякую!
Суміт Анантвар

2
На жаль, деякі засоби локалізації, як-от Passolo, автоматично додають косу рису перед цитатою. І рядок стає таким: <string name = "my_str_spaces"> \ "До і після? \" </string>. Тому ці цитати з’являються в тексті. Тож використання \ u0020 видається кращим у цьому випадку.
Фокс

Я ніде цього не бачу в документації. Найближче, що я можу побачити, - це Enclose the entire string in double quotes ("This'll work", for example)де обговорюється втеча Single quote (').
Межі

Це не працює для мене
Джеймс Ріордан,

38

Я просто використовую код UTF для місця "\ u0020" у файлі strings.xml.

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

працює чудово. (Android любить коди UTF)


2
Це працювало для мене там, де прийнятої відповіді не було.
Ленс


21

Це питання може бути старим, але на сьогодні найпростіший спосіб зробити це - додавати лапки. Наприклад:

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

це прекрасно працює. Просто обведіть бажаний текст лапками "ваш текст"
Тарун Кумар

10

Існує можливість місця з різною шириною:

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

| ПРОСТІР | Тонкий простір | ПРОСТІР ВОЛОСУ | немає місця |

Візуалізація:

введіть тут опис зображення


8

Якщо ви дійсно хочете зробити це так, як ви робили, то, я думаю, ви повинні сказати йому, що пробіл має значення, уникаючи його:

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

Однак для цього я б застосував форматування рядків . Щось таке:

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

тоді

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

1
Втеча зі зворотною косою рисою не працює (принаймні для мене). Використання рядка формату - це чудове рішення загалом, але не завжди. Наприклад, String.formatвикликає багато виділень пам'яті, які небажані в грі.
Томас

уникнути пробілів (використовуючи "\") також не працювало для мене.
андроїд розробник

Форматування працює лише в тому випадку, якщо ваш текст відображається в одному стилі. У моєму випадку дві речі, що поєднуються, є жирними та звичайними та різними кольорами.

5

використовувати "" зі значенням рядкового ресурсу.

Приклад: "значення з пробілами"

АБО

використовувати \ u0020 код для пробілів.


4

Добре працюю, я використовую \ u0020

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

Файл 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();

Знімок екрана Зображення відображення роботи цього коду


2

Можна додати аргумент щодо програмного додавання простору. Оскільки ці випадки будуть часто використовуватися в конкатенаціях, я вирішив припинити безумство і просто зробити старе + " " +. Це буде сенс у більшості європейських мов, я б зібрався.


1

Усі відповіді тут для мене не спрацювали. Натомість, щоб додати пробіл в кінці рядка в XMLя зробив це

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

0

Я, зокрема, не маю уявлення про Android, але це виглядає як звичайна обробка білого простору XML - провідна та відстала пробіли всередині елемента, як правило, вважаються незначними і видаляються. Спробуйте 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>

На жаль, xml:spaceздається, ігнорується.
Томас

0

Це може насправді не відповісти на питання (Як зберегти пробіли в XML), але це може вирішити основну проблему більш витончено.

Замість того, щоб покладатися лише на ресурси XML, об'єднуйтесь, використовуючи рядки формату. Тому спочатку видаліть пробіли

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

А потім побудуйте рядок інакше:

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

Є також рішення використання CDATA. Приклад:

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

Але загалом я думаю, що \u0020це досить добре.


-1

Якщо вам потрібен простір для подальшого з'єднання його з іншими рядками, ви можете використовувати підхід до форматування рядків для додавання аргументів до вашого рядкового визначення:

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

Потім для форматування рядка (наприклад, якщо у вас є помилка, повернута сервером, в іншому випадку використовуйте getString(R.string.string_resource_example)):

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

Результати:

Error: Server error message here

-6

Це не працює з xml: space = "зберегти"

тому я це зробив найшвидшим способом =>

Я просто додав + "" + там, де мені це було потрібно ...

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

2
Який сенс у використанні ресурсів взагалі, якщо ви просто збираєтесь змішувати деякі язикові рядки Java?
Крістофер Джонсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.