Как сохранить пробелы в конце и / или в начале строки?


359

Я должен объединить эти две строки из моих файлов ресурсов / значений:

<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
Гадкий
гадкий

Ответы:


502

Даже если вы используете форматирование строки, иногда вам все еще нужны пробелы в начале или конце вашей строки. В этих случаях не помогает ни экранирование \, ни xml:spaceатрибут. Вы должны использовать сущность HTML &#160;для пробела.

Используйте &#160;для неразрывных пробелов.
Используйте &#032;для обычного пространства.


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

50
& # 160 не работает ... XML-редактор выдает ошибку, и вы не можете создать проект ... \ u0020 работает отлично!
Джамачо

10
Вам нужно добавить точку с запятой (;) в конце.
user1010160

36
\ u0020 это вообще лучшее решение. & # 032; требует, чтобы вы разбирали html и в некоторых случаях могли игнорироваться случайным образом, в результате чего не было места
HaydenKai

5
В Android Studio 3.2 я использовал развертывание на эмуляторе API 25 &#032;, и я не получил ошибку сборки, но мое пространство все еще игнорировалось. &#160;работал, но я не хочу неразрывных пробелов. Я хочу просто регулярное пространство.\u0020работал.
Хит Границы

490

Я столкнулся с той же проблемой. Я хотел оставить пустым в конце строки ресурса, представляющей имя поля на экране.

Я нашел решение по этому вопросу: https://github.com/iBotPeaches/Apktool/issues/124

Это та же идея, которую предлагает Дуесси. Вставьте \u0020непосредственно в XML для пробела, который вы хотели бы сохранить.

Пример :

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

Замена выполняется во время сборки, поэтому она не повлияет на производительность вашей игры.


работает отлично. Интересно, в чем разница между его использованием и & # 160;
Android-разработчик

3
@androiddeveloper, \ u обозначает символ Юникода в качестве escape-последовательности (не символ Юникода непосредственно в файле). & # NNN; указывает на html-сущность, что означает, что вы полагаетесь на то, что ваша xml-строка анализируется в формате html (по умолчанию она используется в текстовых представлениях). См. W3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Интересно, но я не знал, что это по умолчанию. Вы имеете в виду, что если я использую "setText" на строковом ресурсе, он будет работать так же?
Android-разработчик

@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
Как это больше, чем использование символов Юникода! Спасибо!
Sumit Anantwar

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
Это сработало для меня, где принятый ответ не сделал.
Ланс

1
Есть ли что-то новое в существующем ответе ?
user905686

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вызывает много выделений памяти, которые нежелательны в игре.
Томас

выход из пробелов (используя "\") тоже не работал для меня.
Android-разработчик

Форматирование работает, только если ваш текст отображается в одном стиле. В моем случае две вещи, которые объединяются, выделены жирным шрифтом по сравнению с обычным и имеют разные цвета.

5

используйте "" со значением строкового ресурса.

Пример: "значение с пробелами"

ИЛИ

используйте код для пробелов.


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 = "preserve"

так что я сделал это самым быстрым способом =>

Я просто добавил + "" +, где это было нужно ...

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.