Bagaimana cara menjaga spasi di akhir dan / atau di awal sebuah String?

359

Saya harus menyatukan dua string ini dari file sumber daya / nilai saya:

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

Saya melakukannya dengan cara ini:

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

Tetapi spasi di akhir string pertama dan di awal string kedua telah menghilang (ketika Toast ditampilkan) ...

Apa yang harus saya lakukan ?

Saya kira jawabannya ada di sini di tautan dokumentasi ini

atau apakah itu sesuatu seperti menggunakan &amp ;untuk karakter "&" ??

Hubert
sumber
2
Ada beberapa jawaban yang bagus, tetapi tidak ada yang bekerja untuk saya (lihat komentar saya). Bounty adalah untuk setiap jawaban yang menyediakan cara untuk mendapatkan karakter ruang nyata (U + 0020) sebagai karakter pertama atau terakhir dari sumber string.
Thomas
3
Android jahat yang tidak menyenangkan :(
Vlad Spreys

Jawaban:

502

Bahkan jika Anda menggunakan pemformatan string, terkadang Anda masih membutuhkan spasi putih di awal atau di akhir string Anda. Untuk kasus ini, tidak ada yang lolos \, atau xml:spaceatribut membantu. Anda harus menggunakan entitas HTML &#160;untuk spasi putih.

Gunakan &#160;untuk ruang putih yang tidak dapat dipecahkan.
Gunakan &#032;untuk ruang biasa.

duessi
sumber
12
Ini jenis karya, tetapi menyisipkan spasi non-breaking (U + 00A0) bukan ruang biasa. Itu bisa tidak diinginkan dalam beberapa situasi.
Thomas
50
& # 160 tidak berfungsi ... editor xml memberikan kesalahan dan Anda tidak dapat membangun proyek ... \ u0020 berfungsi dengan baik!
jcamacho
10
Anda harus menambahkan titik koma (;) di bagian akhir.
user1010160
36
\ u0020 umumnya merupakan solusi yang lebih baik. & # 032; mengharuskan Anda mengurai html dan dapat diabaikan secara acak dalam beberapa kasus sehingga tidak ada ruang
HaydenKai
5
Pada Android Studio 3.2 yang digunakan untuk emulator API 25, saya menggunakan &#032;, dan saya tidak mendapatkan kesalahan build, tetapi ruang saya masih diabaikan. &#160;bekerja, tapi saya tidak ingin spasi kosong. Saya hanya ingin ruang biasa. \u0020bekerja.
Perbatasan Heath
490

Saya mengalami masalah yang sama. Saya ingin membiarkan yang kosong di ujung string sumber yang mewakili nama bidang di layar.

Saya menemukan solusi pada laporan masalah ini: https://github.com/iBotPeaches/Apktool/issues/124

Ini adalah ide yang sama yang dikemukakan Duessi. Masukkan \u0020langsung dalam XML untuk kosong yang ingin Anda pertahankan.

Contoh:

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

Penggantian dilakukan pada waktu build, oleh karena itu tidak akan mempengaruhi kinerja game Anda.

DavGin
sumber
bekerja dengan baik. bertanya-tanya apa perbedaan antara menggunakannya dan & # 160;
pengembang android
3
@androiddeveloper, \ u menunjukkan karakter unicode sebagai urutan pelarian (bukan karakter unicode langsung dalam file). & # nnn; menunjukkan entitas html, yang berarti bahwa Anda mengandalkan string xml yang diurai html (secara default bila digunakan dalam tampilan teks). Lihat w3schools.com/html/html_entities.asp
greg7gkb
@ greg7gkb Menarik, tapi saya tidak tahu secara default. Maksud Anda jika saya menggunakan "setText" pada sumber daya string, itu akan bekerja sama?
pengembang android
@androiddeveloper Ya, saya baru saja mengkonfirmasi ini dalam kode. Anda dapat memiliki entitas html di file xml string Anda dan mereka akan dikonversi secara default dengan setText (int resId). Contoh: <string name = "test"> T & # 160; S & # 160; T & # 160; </string>.
greg7gkb
5
\u0020adalah SPACE dari kode ASCII. Ini adalah pilihan terbaik untuk proyek saya karena saya harus memastikan itu adalah ASCII.
OneWorld
138

Dokumentasi ini menyarankan agar kutipan berhasil:

<string name="my_str_spaces">" Before and after? "</string>
Skywalker5446
sumber
2
Apakah itu menjamin<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek
5
Lebih suka ini daripada menggunakan karakter unicode! Terima kasih!
Sumit Anantwar
2
Sayangnya beberapa alat pelokalan, seperti Passolo, secara otomatis menambahkan garis miring sebelum penawaran. Dan string menjadi ini: <string name = "my_str_spaces"> \ "Sebelum dan sesudah? \" </string>. Oleh karena itu, kutipan ini muncul dalam teks. Jadi menggunakan \ u0020 tampaknya lebih baik dalam hal ini.
Fox
Saya tidak melihat ini disebutkan di mana pun dalam dokumentasi. Yang paling dekat yang bisa saya lihat adalah di Enclose the entire string in double quotes ("This'll work", for example)mana ia membahas tentang melarikan diri Single quote (').
Perbatasan Heath
Ini tidak berhasil untuk saya
James Riordan
38

Saya hanya menggunakan kode UTF untuk spasi "\ u0020" di file strings.xml.

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

bekerja dengan baik. (Android menyukai kode UTF)

Jasen
sumber
2
Ini bekerja untuk saya di mana jawaban yang diterima tidak.
Lance
1
Adakah yang baru dengan jawaban yang ada ?
user905686
21

Pertanyaan ini mungkin sudah lama, tetapi sampai sekarang cara termudah untuk melakukannya adalah menambahkan tanda kutip. Sebagai contoh:

<string name="Toast_Memory_GameWon_part1">"you found ALL PAIRS ! on "</string>
<string name="Toast_Memory_GameWon_part2">" flips !"</string>
kyay
sumber
ini bekerja dengan sempurna. Cukup kelilingi teks yang Anda inginkan dengan tanda kuota "teks Anda"
Tarun Kumar
10

Ada kemungkinan untuk ruang dengan lebar berbeda:

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

| SPACE | RUANG TIPIS | RUANG RAMBUT | tidak ada ruang |

Visualisasi:

masukkan deskripsi gambar di sini

Andrey
sumber
8

Jika Anda benar-benar ingin melakukannya dengan cara yang Anda lakukan maka saya pikir Anda harus mengatakannya bahwa spasi putih relevan dengan menghindarinya:

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

Namun, saya akan menggunakan pemformatan string untuk ini. Sesuatu seperti yang berikut ini:

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

kemudian

String message_all_pairs_found = String.format(getString(R.string.Toast_Memory_GameWon), total_flips);
Jeremy Logan
sumber
1
Melarikan diri dengan backslash tidak berhasil (setidaknya untuk saya). Menggunakan format string adalah solusi yang bagus umumnya, tetapi tidak selalu. Misalnya, String.formatmenyebabkan banyak alokasi memori yang tidak diinginkan dalam game.
Thomas
keluar dari spasi (menggunakan "\") juga tidak berhasil untuk saya.
pengembang android
Memformat hanya berfungsi jika teks Anda semua ditampilkan dalam gaya yang sama. Dalam kasus saya 2 hal yang disatukan adalah warna tebal vs normal dan berbeda.
5

gunakan "" dengan nilai sumber daya string.

Contoh: "nilai dengan spasi"

ATAU

gunakan kode \ u0020 untuk spasi.

Bhupendra Joshi
sumber
4

Bekerja dengan baik, saya menggunakan \ 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();

Tangkapan layar di sini Gambar Menampilkan Bekerja dari kode ini

Tarsbir Singh
sumber
2

Argumen dapat dibuat untuk menambahkan ruang secara terprogram. Karena kasus-kasus ini akan sering digunakan dalam pertemuan, saya memutuskan untuk menghentikan kegilaan dan melakukan yang lama + " " +. Ini akan masuk akal di sebagian besar bahasa Eropa, saya akan kumpulkan.

MPelletier
sumber
1

Semua jawaban di sini tidak bekerja untuk saya. Sebagai gantinya, untuk menambahkan spasi di akhir string di XMLsaya melakukan ini

<string name="more_store">more store<b> </b> </string>
toobsco42
sumber
0

Saya tidak tahu tentang Android pada khususnya, tetapi ini tampak seperti penanganan spasi putih XML biasa - memimpin dan mengikuti spasi putih dalam suatu elemen umumnya dianggap tidak signifikan dan dihapus. Coba 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>
Pavel Minaev
sumber
Sayangnya, xml:spacesepertinya diabaikan.
Thomas
0

Ini mungkin tidak benar-benar menjawab pertanyaan (Bagaimana menjaga spasi putih di XML) tetapi mungkin memecahkan masalah yang mendasarinya lebih anggun.

Alih-alih hanya mengandalkan sumber daya XML, gabungkan menggunakan string format. Jadi pertama-tama hapus spasi putih

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

Dan kemudian membangun string Anda secara berbeda:

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();
Skusku
sumber
0

Ada juga solusi menggunakan CDATA. Contoh:

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

Namun secara umum menurut saya \u0020cukup baik.

pengembang android
sumber
-1

Jika Anda membutuhkan ruang untuk tujuan kemudian menggabungkannya dengan string lain, maka Anda dapat menggunakan pendekatan pemformatan string dengan menambahkan argumen ke definisi string Anda:

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

Kemudian untuk memformat string (mis. Jika Anda memiliki kesalahan yang dikembalikan oleh server, jika tidak gunakan getString(R.string.string_resource_example)):

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

Yang mengakibatkan:

Error: Server error message here
ITIT
sumber
-6

Itu tidak bekerja dengan xml: space = "preservate"

jadi saya melakukannya dengan cara tercepat =>

Saya hanya menambahkan + "" + di mana saya membutuhkannya ...

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+" "+total_flips+" "+getString(R.string.Toast_Memory_GameWon_part2);
Hubert
sumber
2
Apa gunanya menggunakan sumber daya sama sekali jika Anda hanya akan mencampur beberapa string Java literal?
Kristopher Johnson