จะรักษาช่องว่างท้ายและ / หรือจุดเริ่มต้นของสตริงได้อย่างไร


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

แต่ช่องว่างที่ท้ายสตริงแรกและที่จุดเริ่มต้นของสตริงที่สองหายไป (เมื่อแสดง Toast) ...

ฉันควรทำอย่างไรดี ?

ฉันเดาคำตอบอยู่ที่นี่ในลิงค์เอกสารนี้

หรือเป็นสิ่งที่ต้องการใช้&amp ;สำหรับอักขระ "&"


2
มีคำตอบที่ดีสองสามข้อ แต่ไม่มีคำตอบใดที่เหมาะกับฉัน (ดูความคิดเห็นของฉัน) รางวัลสำหรับคำตอบใด ๆ ที่ให้วิธีรับอักขระช่องว่างจริง (U + 0020) เป็นอักขระตัวแรกหรือตัวสุดท้ายของทรัพยากรสตริง
โทมัส

3
Nasty android ที่น่ารังเกียจ :(
Vlad Spreys

คำตอบ:


502

แม้ว่าคุณจะใช้การจัดรูปแบบสตริงบางครั้งคุณยังต้องการช่องว่างสีขาวที่จุดเริ่มต้นหรือจุดสิ้นสุดของสตริง สำหรับกรณีเหล่านี้จะไม่มีการหลบหนี\และไม่มีxml:spaceคุณสมบัติช่วย คุณต้องใช้เอนทิตี HTML &#160;สำหรับช่องว่าง

ใช้&#160;สำหรับช่องว่างที่ไม่แตกหักได้
ใช้&#032;สำหรับพื้นที่ปกติ


12
งานประเภทนี้แต่แทรกพื้นที่ไม่แตกหัก (U + 00A0) แทนพื้นที่ปกติ ที่ไม่พึงประสงค์ในบางสถานการณ์
โทมัส

50
& # 160 ไม่ทำงาน ... ตัวแก้ไข xml มีข้อผิดพลาดและคุณไม่สามารถสร้างโครงการ ... \ u0020 ทำงานได้ดี!
jcamacho

10
คุณต้องเพิ่มเซมิโคลอน (;) ในตอนท้าย
user1010160

36
โดยทั่วไปคือทางออกที่ดีกว่า & # 032; ต้องการให้คุณแยกวิเคราะห์ HTML และสามารถละเว้นแบบสุ่มในบางกรณีทำให้ไม่มีที่ว่าง
HaydenKai

5
ใน Android Studio 3.2 การปรับใช้กับโปรแกรมจำลองการทำงาน API 25 ฉันใช้&#032;และฉันไม่มีข้อผิดพลาดในการสร้าง แต่พื้นที่ของฉันยังคงถูกละเว้น &#160;ทำงานได้ แต่ฉันไม่ต้องการช่องว่างที่ไม่แตกหักง่าย ฉันต้องการพื้นที่ว่างปกติ \u0020ทำงาน
Heath Borders

489

ฉันพบปัญหาเดียวกัน ฉันต้องการเว้นว่างไว้ท้ายสตริงทรัพยากรที่แสดงชื่อฟิลด์บนหน้าจอ

ฉันพบวิธีแก้ไขปัญหาในรายงานปัญหานี้: https://github.com/iBotPeaches/Apktool/issues/124

นี่เป็นความคิดเดียวกับที่ Duessi แนะนำ แทรก\u0020โดยตรงใน XML สำหรับช่องว่างที่คุณต้องการเก็บไว้

ตัวอย่าง:

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

การเปลี่ยนจะดำเนินการในเวลาที่สร้างดังนั้นมันจะไม่ส่งผลต่อประสิทธิภาพของเกมของคุณ


ใช้งานได้ดี สงสัยว่าความแตกต่างระหว่างการใช้งานกับ & # 160;
นักพัฒนา android

3
@androiddeveloper \ u บ่งชี้อักขระ unicode เป็นลำดับ escape (ไม่ใช่อักขระ Unicode ในไฟล์โดยตรง) & # 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คือ SPACE ของรหัส 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 น่าจะดีกว่าในกรณีนี้
Fox

ฉันไม่เห็นสิ่งที่กล่าวถึงในเอกสาร ที่อยู่ใกล้ฉันสามารถมองเห็นเป็นที่จะกล่าวถึงหนีEnclose the entire string in double quotes ("This'll work", for example) Single quote (')
Heath Borders

สิ่งนี้ไม่ได้ผลสำหรับฉัน
James Riordan

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>

มันทำงานได้อย่างสมบูรณ์แบบ เพียงล้อมรอบข้อความที่คุณต้องการด้วยเครื่องหมาย "ข้อความของคุณ"
Tarun Kumar

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

การจัดรูปแบบใช้งานได้เฉพาะเมื่อข้อความของคุณแสดงในสไตล์เดียวกันทั้งหมด ในกรณีของฉัน 2 สิ่งที่เข้าร่วมนั้นเป็นตัวหนาและสีต่างกัน


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

สามารถสร้างอาร์กิวเมนต์เพื่อเพิ่มช่องว่างโดยทางโปรแกรม ตั้งแต่กรณีเหล่านี้จะถูกนำมาใช้มักจะอยู่ใน concatenations + " " +ฉันตัดสินใจที่จะหยุดความบ้าและเพียงแค่ทำเก่า ฉันจะรวบรวมภาษาเหล่านี้ในภาษายุโรปส่วนใหญ่


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

ดังนั้นฉันจึงทำวิธีที่เร็วที่สุด =>

ฉันเพิ่งเพิ่ม + "" + ที่ฉันต้องการ ...

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

2
จุดประสงค์ของการใช้ทรัพยากรคืออะไรหากคุณกำลังจะผสมในตัวอักษรสตริง Java บางตัว?
Kristopher Johnson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.