Bir Dizenin sonunda ve / veya başında boşluklar nasıl tutulur?


359

Kaynak / değer dosyalarımdan bu iki dizeyi birleştirmek zorunda:

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

Bunu şu şekilde yaparım:

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

Ancak ilk dizenin sonundaki ve ikinci dizenin başındaki boşluklar kayboldu (Tost gösterildiğinde) ...

Ne yapmalıyım ?

Sanırım cevap bu dokümantasyon bağlantısının bir yerinde

ya da &amp ;"&" karakteri için kullanmak gibi bir şey mi ??


2
Birkaç iyi cevap var, ama hiçbiri benim için çalışmıyor (yorumlarıma bakın). Ödül, dize kaynağının ilk veya son karakteri olarak gerçek bir boşluk karakteri (U + 0020) almanın bir yolunu sağlayan herhangi bir yanıt içindir.
Thomas

3
Kötü kötü android :(
Vlad Spreys

Yanıtlar:


502

Dize biçimlendirmesi kullansanız bile, bazen dizenizin başında veya sonunda beyaz boşluklara ihtiyacınız olabilir. Bu durumlar için ne kaçmak \ne de xml:spacenitelik yardımcı olur. &#160;Bir boşluk için HTML objesini kullanmanız gerekir .

&#160;Kırılmaz boşluklar için kullanın . Normal alan için
kullanın &#032;.


12
Bu tür çalışır, ancak normal bir boşluk yerine kırılmaz bir boşluk (U + 00A0) ekler. Bazı durumlarda bu istenmeyen bir durum olabilir.
Thomas

50
& # 160 çalışmıyor ... xml editörü hata veriyor ve projeyi oluşturamıyorsunuz ... \ u0020 iyi çalışıyor!
jcamacho

10
Sonunda noktalı virgül (;) eklemeniz gerekir.
user1010160

36
\ u0020 genellikle daha iyi bir çözümdür. & # 032; html ayrıştırmanızı gerektirir ve bazı durumlarda boşluk
bırakmadan

5
Bir API 25 öykünücüsüne dağıtım yapan Android Studio 3.2'de kullandım &#032;ve derleme hatası almadım, ancak alanım hala yok sayıldı. &#160;ama kırılamaz bir boşluk istemiyorum. Sadece düzenli bir yer istiyorum. \u0020çalıştı.
Heath Borders

490

Ben de aynı sorunla karşılaştım. Bir ekran alanı adını temsil eden bir kaynak dizesinin sonunda boş bırakmak istedim.

Bu sorun raporunda bir çözüm buldum: https://github.com/iBotPeaches/Apktool/issues/124

Bu, Duessi'nin önerdiği fikirle aynı. \u0020Korumak istediğiniz bir boşluk için doğrudan XML'ye ekleyin .

Misal :

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

Değiştirme işlemi yapım zamanında yapılır, bu nedenle oyununuzun performansını etkilemez.


harika çalışıyor. onu kullanmak arasındaki farkın ne olduğunu merak ediyorum & & # 160;
android geliştirici

3
@androiddeveloper, \ u bir unicode karakterini bir çıkış sırası olarak belirtir (doğrudan dosyadaki unicode karakterlerini değil). & # nnn; bir html varlığını gösterir; bu, xml dizenizin html ayrıştırılmasına bağlı olduğunuzu gösterir (metin görünümlerinde kullanıldığında varsayılan olarak). Bkz w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb İlginç, ama varsayılan olarak bilmiyordum. Dize kaynağı üzerinde "setText" kullanırsam, aynı çalışır?
android geliştirici

@androiddeveloper Evet, bunu kodda onayladım. Dizeler xml dosyanızda html varlıkları olabilir ve bunlar varsayılan olarak setText (int resId) ile dönüştürülür. Örnek: <string name = "test"> T & # 160; S & # 160; </string>.
greg7gkb

5
\u0020SPACE of ASCII kodudur. ASCII olduğundan emin olmam gerektiğinden projem için en iyi seçim buydu.
OneWorld

138

Bu belge , alıntılamanın işe yarayacağını göstermektedir:

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

2
Garanti veriyor mu?<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek

5
Bunun gibi unicode karakterler kullanmaktan daha fazlası! Teşekkürler!
Sumit Anantwar

2
Maalesef Passolo gibi bazı yerelleştirme araçları, tekliften önce otomatik olarak eğik çizgi ekler. Ve string şu olur: <string name = "my_str_spaces"> \ "? \" </string> öncesi ve sonrası. Bu nedenle, bu alıntılar metinde görünür. Yani \ u0020 kullanmak bu durumda daha iyi görünüyor.
Fox

Bu belgede belirtilen hiçbir yerde görmüyorum. Görebildiğim en yakın şey, Enclose the entire string in double quotes ("This'll work", for example)kaçmayı tartıştığı yer Single quote (').
Heath Borders

38

UTF kodunu strings.xml dosyasındaki "\ u0020" alanı için kullanıyorum.

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

harika çalışıyor. (Android UTF kodlarını sever)


2
Kabul edilen cevabın olmadığı yerde bu benim için çalıştı.
Lance

1
Mevcut cevapta yeni bir şey var mı ?
user905686

21

Bu soru eski olabilir, ancak şu andan itibaren bunu yapmanın en kolay yolu tırnak işareti eklemektir. Örneğin:

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

bu mükemmel çalışıyor. İstediğiniz metni tırnak işaretleri arasında "metninizle" çevreleyin
Tarun Kumar

11

Farklı genişliklerde yer açmak mümkündür:

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

| MEKAN | İNCE ALAN | SAÇ ALANI | yer yok |

Görselleştirme:

resim açıklamasını buraya girin


8

Eğer gerçekten yaptığınız gibi yapmak istiyorsanız, o zaman boşluktan kaçarak ilgili olduğunu söylemelisiniz:

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

Ancak, bunun için dize biçimlendirme kullanırdım . Aşağıdaki gibi bir şey:

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

sonra

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

1
Ters eğik çizgi ile kaçmak işe yaramaz (en azından benim için). Bir biçim dizesi kullanmak genellikle harika bir çözümdür, ancak her zaman değil. Örneğin, String.formatbir oyunda istenmeyen birçok bellek ayırmasına neden olur.
Thomas

boşluklardan kaçmak ("\" kullanarak) benim için de işe yaramadı.
android geliştirici

Biçimlendirme yalnızca metninizin tümü aynı stilde görüntüleniyorsa çalışır. Benim durumumda, birleştirilen 2 şey normal ve farklı renklere göre cesur.

5

dize kaynak değeriyle "" kullanın.

Örnek: "boşluklu değer"

VEYA

boşluklar için \ u0020 kodunu kullanın.


4

İyi çalışıyor \ u0020 kullanıyorum

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

Java dosyası

String finalScore = getString(R.string.hi) +name+ getString(R.string.youHaveScored)+score+ getString(R.string.ten);
               Toast.makeText(getApplicationContext(),finalScore,Toast.LENGTH_LONG).show();

Ekran görüntüsü burada Gösteriliyor Bu kodun çalışmasını gösteren resim


2

Alanı programlı olarak eklemek için bir argüman yapılabilir. Bu vakalar birleştirme işlemlerinde sıklıkla kullanılacağından, deliliği durdurmaya ve eskisini yapmaya karar verdim + " " +. Bunlar çoğu Avrupa dilinde mantıklı olacak , toplardım.


1

Buradaki tüm cevaplar benim için işe yaramadı. Bunun yerine, bir dizenin sonuna bir boşluk eklemek için XMLbunu yaptım

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

0

Özellikle Android hakkında hiçbir fikrim yok, ama bu her zamanki XML boşluk işleme gibi görünüyor - bir öğe içinde önde gelen ve sondaki boşluk genellikle önemsiz ve kaldırıldı. Deneyin 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>

Maalesef xml:spaceyok sayılıyor gibi görünüyor.
Thomas

0

Bu aslında (XML'de boşluklar nasıl tutulur) sorusuna cevap vermeyebilir, ancak altta yatan sorunu daha zarif bir şekilde çözebilir.

Yalnızca XML kaynaklarına güvenmek yerine, biçim dizelerini kullanarak birleştirin. Bu yüzden önce beyaz boşlukları kaldırın

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

Ve sonra dizenizi farklı şekilde oluşturun:

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

Kullanmanın bir çözümü de var CDATA. Misal:

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

Ama genel olarak bence \u0020yeterince iyi.


-1

Daha sonra başka dizelerle birleştirmek için boşluğa ihtiyacınız varsa, dize tanımınıza bağımsız değişkenler eklemek için dize biçimlendirme yaklaşımını kullanabilirsiniz:

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

Ardından dizeyi biçimlendirmek için (örneğin, sunucu tarafından döndürülen bir hata varsa, aksi takdirde şunu kullanın getString(R.string.string_resource_example)):

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

Sonuç:

Error: Server error message here

-6

Xml ile çalışmaz: space = "preserve"

bu yüzden en hızlı şekilde yaptım =>

İhtiyacım olan yere bir + "" + ekledim ...

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

2
Bazı Java dizgi değişmezlerini karıştıracaksanız, kaynakları kullanmanın anlamı nedir?
Kristopher Johnson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.