สัญลักษณ์เปอร์เซ็นต์ Android XML


309

ฉันมีชุดของสตริงที่ใช้%สัญลักษณ์ รูปแบบที่เหมาะสมสำหรับการใช้คือ% %เมื่อฉันมีสตริงในอาร์เรย์ที่มีหลาย%มันทำให้ฉันข้อผิดพลาดนี้

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected

6
คุณสามารถโพสต์ XML ที่ทำให้เกิดข้อผิดพลาดนี้ได้หรือไม่ มันอาจเป็นเรื่องยากมากที่จะระบุปัญหาโดยไม่เห็นสาเหตุ
Chris Cashwell

นี่เป็นข้อผิดพลาดที่สามารถทำซ้ำได้อย่างง่ายดายด้วยสตริงใด ๆ ที่มีสัญลักษณ์ 2% หรือมากกว่า
zaid

หากไม่ต้องการจุดประสงค์ในการจัดรูปแบบวิธีที่ดีกว่าที่จะทำให้สำเร็จ
Shishir Gupta

ในกรณีของฉันฉันป้อนพารามิเตอร์การจัดรูปแบบผิดพลาดเป็น 1% $ s แทนที่จะเป็น% 1 $ s
Ashokchakravarthi Nagarajan

คำตอบ:


467

เครื่องมือการบรรจุสินทรัพย์ของ Android ( aapt) ได้กลายเป็นเข้มงวดมากในรุ่นล่าสุดและตอนนี้ใช้สำหรับAndroid ทุกรุ่น aapt ข้อผิดพลาดที่คุณได้รับจะถูกสร้างขึ้นเพราะมันไม่ช่วยให้specifiers รูปแบบที่ไม่ตำแหน่ง

นี่คือแนวคิดบางประการที่คุณสามารถรวม% -symbol ในสตริงทรัพยากรของคุณได้

หากคุณไม่ต้องการตัวระบุรูปแบบหรือการแทนที่ในสตริงของคุณคุณสามารถใช้formattedคุณลักษณะและตั้งค่าเป็นfalse:

<string formatted="false">%a + %a == 2%a</string>

ในกรณีนี้สตริงจะไม่ถูกใช้เป็นสตริงรูปแบบเพื่อFormatterให้คุณไม่ต้องหลบหนี% -symbols ของคุณ สตริงผลลัพธ์คือ "% a +% a == 2% a"

หากคุณไม่ใช้แอformatted="false"ททริบิวสตริงนั้นจะใช้เป็นสตริงรูปแบบและคุณต้องหลีกเลี่ยง% -symbols สิ่งนี้ทำได้อย่างถูกต้องด้วย double-%:

<string>%%a + %%a == 2%%a</string>

ตอนนี้aaptไม่มีข้อผิดพลาด แต่ขึ้นอยู่กับวิธีการใช้งานสตริงที่ได้อาจเป็น "%% a + %% a == 2 %% a" ถ้า a Formatterถูกเรียกใช้โดยไม่มีอาร์กิวเมนต์รูปแบบใด ๆ:

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

หากไม่มี xml และรหัสมันเป็นการยากที่จะบอกว่าปัญหาของคุณคืออะไร แต่หวังว่าจะช่วยให้คุณเข้าใจกลไกได้ดีขึ้นเล็กน้อย


1
ฉันเลือกสิ่งนี้เป็นคำตอบเพราะควรใช้งานได้ แต่เห็นได้ชัดว่ามีข้อผิดพลาดที่ฉันใช้กับสตริงนั้นดังนั้น ive จึงตัดสินใจใช้ %% และ "XXX.replaceAll (" %% ","% ");"
zaid

4
ใช้formatted = falseอย่างดี นี่คือวิธีที่ฉันใช้: <string name = "information_description" formatted = "false"> \ 'Sweet \' 10% ถึง 20% แม้น้ำตาล 35% โดยน้ำหนัก </string>
คนอยู่ที่ไหนสักแห่ง

1
formatted = false ก็ใช้ได้ผลสำหรับฉันเช่นกัน เมื่อใช้ %% มันจะปรากฏเป็น %% อย่างแท้จริงในอุปกรณ์และตัวจำลองของฉัน ..
samwize

formatted = false ทำงานได้ดีสำหรับฉันในอดีต ตอนนี้ (ADT 22) ด้วยเหตุผลบางอย่าง และถ้าฉันใช้: "str = mContext.getString (R.string.str," hello ")" มันจะมีคำเตือนว่า: "รูปแบบสตริง 'str' ไม่ใช่รูปแบบของสตริงที่ถูกต้องดังนั้นจึงไม่ควรส่งผ่านไปยัง String.format "
พัฒนา Android

1
หากคุณกำลังเข้าถึงจาก <string-array /> ดังนั้นสำหรับการพิมพ์เปอร์เซ็นต์ใช้ \ u0025 สิ่งนี้ใช้ได้สำหรับฉัน
Chintan Shah

157

ในการอนุญาตให้แอปใช้สตริงที่จัดรูปแบบจากแหล่งข้อมูลคุณควรแก้ไข xml ของคุณ ตัวอย่างเช่น

<string name="app_name">Your App name, ver.%d</string>

ควรถูกแทนที่ด้วย

<string name="app_name">Your App name, ver.%1$d</string>

คุณสามารถดูนี้สำหรับรายละเอียด


2
ขอขอบคุณคุณระบุลิงก์ที่หายไป - อย่างแท้จริง
akauppi

22
เพื่อทดแทนหลายพารามิเตอร์ (เช่นกับสตริง), การใช้งาน%1$s, %2$sฯลฯ
CJBS

1
ใครจะอ่านคำตอบที่ยิ่งใหญ่สำหรับสิ่งเล็ก ๆ นี้? ขอบคุณฉันเลื่อนลงเพื่อค้นหาคุณ
Janaka R Rajapaksha

73

คุณสามารถยกเว้น% โดยใช้ %% สำหรับตัวแยกวิเคราะห์ XML แต่จะแสดงสองครั้งในอุปกรณ์

หากต้องการแสดงเพียงครั้งเดียวให้ลองรูปแบบต่อไปนี้: \%%

ตัวอย่างเช่น

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

แสดงเป็น Fat Burning (50% to 60%)ในอุปกรณ์


6
\ %% ทำให้ล่มใน Nexus 4 4.2.1 ยังไม่ได้ทดสอบคนอื่น
Jon Willis

วิธีนี้ใช้งานได้ดีและง่ายเมื่อคุณทราบเปอร์เซ็นต์ที่คุณต้องการรวมไว้ในสตริงของคุณแล้วเมื่อเทียบกับการใช้ตัวจัดรูปแบบสตริงและจำเป็นต้องตั้งค่าฮาร์ดโค้ดที่มีการเขียนโปรแกรม
portfoliobuilder

สิ่งนี้ขัดข้องสำหรับฉันเช่นกันบน Nexus 5.1.1 @ViliusK คำตอบคือคำตอบที่ถูกต้อง
จันจิงหง

2
เพียงใช้ %% แทน%
Sundeep1501

37

ใช้

<string name="win_percentage">%d%% wins</string>

เพื่อรับ

80% wins เป็นสตริงที่จัดรูปแบบ

ผมใช้วิธีการที่จะได้รับหมายเลขแทรกแทนString.format()%d


12

ในไฟล์ strings.xml ของคุณคุณสามารถใช้สัญลักษณ์ Unicode ที่คุณต้องการ

ตัวอย่างเช่นหมายเลข Unicode สำหรับเครื่องหมายเปอร์เซ็นต์คือ 0025:

<string name="percent_sign">&#x0025;</string>

คุณสามารถดูรายการสัญลักษณ์ Unicode ที่ครอบคลุมได้ที่นี่


1
ที่ไม่สมเหตุสมผลใด ๆ & # x0025; และ% เหมือนกันในไฟล์ xml
BeniBela

ไฟล์ทรัพยากรถูกแปลงเป็นทรัพยากร Java และในการทำเช่นนั้น%ตัวละครกลับ ฉันกลัวว่านี่จะไม่ช่วยแก้ปัญหา
Paul Lammertsma

9

ในการหลีกเลี่ยงสัญลักษณ์เปอร์เซนต์คุณเพียงต้องการ %%

ตัวอย่างเช่น :

String.format("%1$d%%", 10)

ส่งคืน "10%"


1
คำตอบของคุณนั้นเหมือนกับคำตอบอื่น ๆ ที่มีอยู่มากมาย
Ben Rhys-Lewis

... และผิดเพราะ10%ไม่กลับ%10มา FIY: เมื่อคุณใช้String.formatคุณควรระบุ Locale ทุกครั้ง คุณสามารถจะประหลาดใจจริงๆเมื่อคุณไม่ใส่สถานที่เกิดเหตุและใช้สถานที่ภาษาอาหรับสำหรับตัวเลขรูปแบบ ...
mtrakal

7

ไม่ใช่ปัญหาของคุณ แต่เป็นปัญหาที่คล้ายกัน

หากคุณมีการจัดรูปแบบมากกว่าหนึ่งรายการในรายการสตริงของคุณคุณไม่ควรใช้ "% s" หลายครั้ง

อย่า:

<string name="entry">Planned time %s - %s (%s)</string>

ทำ:

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>

5

คุณสามารถยกเว้น% ใน xml ด้วย %% แต่คุณต้องตั้งค่าข้อความเป็นรหัสไม่ใช่ในโครงร่าง xml


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

5

นี่อาจเป็นกรณีของ IDE ที่เข้มงวดเกินไป

ความคิดคือเสียงโดยทั่วไปคุณควรระบุลำดับของตัวแปรการแทนที่เพื่อให้คุณเพิ่มทรัพยากรสำหรับภาษาอื่นรหัส java ของคุณจะไม่จำเป็นต้องเปลี่ยน อย่างไรก็ตามมีสองประเด็นด้วยกัน:

ประการแรกสตริงเช่น:

You will need %.5G %s

ที่จะใช้ตามที่คุณต้องการ 2.1200 มก.จะมีคำสั่งเหมือนกันในภาษาใด ๆ เนื่องจากปริมาณของมวลนั้นจะแสดงตามลำดับทางวิทยาศาสตร์เสมอ

อย่างที่สองคือถ้าคุณใส่คำสั่งของตัวแปรในสิ่งที่เคยภาษาทรัพยากรเริ่มต้นของคุณจะถูกระบุใน (เช่นภาษาอังกฤษ) จากนั้นคุณจะต้องระบุตำแหน่งในสตริงทรัพยากรสำหรับภาษาที่ใช้ลำดับที่แตกต่างกับภาษาเริ่มต้นของคุณ

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

คุณจะต้อง% 1 $ .5G% 2 $ s



3

ลองอันนี้ (ขวา):

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>


-1

สมมติว่าคุณต้องการแสดง (ลด 50%) และป้อน 50 ตอนรันไทม์ นี่คือรหัส:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

ในคลาส java ใช้รหัสนี้:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);

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