เป็นไปได้หรือไม่ที่จะมีตัวยึดตำแหน่งในค่าสตริงstring.xml
ที่สามารถกำหนดค่าในขณะใช้งานได้
ตัวอย่าง:
บางสตริงPLACEHOLDER1บางสตริงเพิ่มเติม
เป็นไปได้หรือไม่ที่จะมีตัวยึดตำแหน่งในค่าสตริงstring.xml
ที่สามารถกำหนดค่าในขณะใช้งานได้
ตัวอย่าง:
บางสตริงPLACEHOLDER1บางสตริงเพิ่มเติม
คำตอบ:
ใช่ดูสิ่งต่อไปนี้จากทรัพยากรสตริง: การจัดรูปแบบและจัดแต่งทรงผม
หากคุณต้องการจัดรูปแบบสตริงของคุณโดยใช้
String.format(String, Object...)
คุณสามารถทำได้โดยใส่อาร์กิวเมนต์รูปแบบของคุณในทรัพยากรสตริง ตัวอย่างเช่นด้วยทรัพยากรต่อไปนี้:<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
ในตัวอย่างนี้สตริงรูปแบบมีสองอาร์กิวเมนต์:
%1$s
เป็นสตริงและ%2$d
เป็นตัวเลขทศนิยม คุณสามารถจัดรูปแบบสตริงด้วยอาร์กิวเมนต์จากแอปพลิเคชันของคุณเช่นนี้:Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
โปรดทราบว่าgetString
มีการโอเวอร์โหลดที่ใช้สตริงเป็นสตริงรูปแบบ:
String text = res.getString(R.string.welcome_messages, username, mailCount);
หากคุณต้องการจัดการกับพหูพจน์ใช้สิ่งนี้:
<plurals name="welcome_messages">
<item quantity="one">Hello, %1$s! You have a new message.</item>
<item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>
mailCount
พารามิเตอร์แรกถูกใช้เพื่อตัดสินใจว่ารูปแบบใดที่จะใช้ (เดี่ยวหรือพหูพจน์) อีกพารามิเตอร์หนึ่งคือการแทนที่ของคุณ:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
ดูทรัพยากร String: พหูพจน์สำหรับรายละเอียดเพิ่มเติม
เมื่อฉันเห็นครั้งแรก%1$s
และ%2$d
ในคำตอบที่ยอมรับก็ไม่สมเหตุสมผล นี่คือคำอธิบายเพิ่มเติมเล็กน้อย
พวกเขาเรียกว่าตัวระบุรูปแบบ ในสตริง xml พวกเขาอยู่ในรูปแบบของ
%[parameter_index$][format_type]
1$
, และ2$
3$
คำสั่งซื้อที่คุณวางไว้ในสตริงทรัพยากรนั้นไม่สำคัญเพียงแค่คำสั่งซื้อที่คุณจัดหาพารามิเตอร์เท่านั้นประเภทรูปแบบ : มีหลายวิธีที่คุณสามารถจัดรูปแบบสิ่งต่าง ๆ ( ดูเอกสารประกอบ ) นี่คือบางส่วนที่พบบ่อย:
s
เชือกd
จำนวนเต็มทศนิยมf
จำนวนจุดลอยตัวเราจะสร้างสตริงที่จัดรูปแบบต่อไปนี้โดยที่ส่วนสีเทาถูกแทรกโดยทางโปรแกรม
น้องสาวของฉัน
Mary
เป็น12
ปี
string.xml
<string name="my_xml_string">My sister %1$s is %2$d years old.</string>
MyActivity.java
String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);
getString
เพราะฉันอยู่ในกิจกรรม คุณสามารถใช้context.getResources().getString(...)
หากไม่สามารถใช้ได้String.format()
จะจัดรูปแบบสตริงด้วย1$
และ2$
แง่ไม่จำเป็นต้องนำมาใช้ในการสั่งซื้อที่ นั่นคือสามารถมาก่อน2$
1$
สิ่งนี้มีประโยชน์เมื่อทำการแอปพลิเคชันสากลสำหรับภาษาที่ใช้ลำดับของคำต่างกัน%1$s
หลายครั้งใน xml หากคุณต้องการทำซ้ำ%%
เพื่อรับ%
ตัวละครจริงเมื่อคุณต้องการใช้พารามิเตอร์จากไฟล์ strings.xml จริงโดยไม่ต้องใช้โค้ด Java ใด ๆ :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY appname "WhereDat">
<!ENTITY author "Oded">
]>
<resources>
<string name="app_name">&appname;</string>
<string name="description">The &appname; app was created by &author;</string>
</resources>
สิ่งนี้ใช้ไม่ได้กับไฟล์ทรัพยากรนั่นคือต้องคัดลอกตัวแปรไปยังไฟล์ XML แต่ละไฟล์ที่ต้องการ
<!DOCTYPE... ]>
ส่วนในไฟล์แยกและรวมไว้ในไฟล์ทรัพยากรหลาย ๆ ? เคล็ดลับเพื่อให้บรรลุนี้
กำลังมองหาสิ่งเดียวกันและในที่สุดก็พบทางออกที่ง่ายมากดังต่อไปนี้ ดีที่สุด: ทำงานนอกกรอบ
1. แก้ไขข้อความที่เป็นสตริงของคุณ:
<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have
<xliff:g name="count">%d</xliff:g> new messages.</string>
2. ใช้การแทนที่สตริง:
c.getString(R.string.welcome_messages,name,count);
โดยที่ c คือบริบทชื่อเป็นตัวแปรสตริงและนับตัวแปร int ของคุณ
คุณจะต้องรวม
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
ใน res / strings.xml ของคุณ ได้ผลสำหรับฉัน :)
xliff
แท็กรอบ specifiers รูปแบบ? พวกเขาจะเพิ่มมูลค่าพิเศษอะไรเมื่อเทียบกับการใช้%s
และตัว%d
ระบุเฉพาะด้วยตนเอง?
ใน Kotlin คุณเพียงแค่ต้องตั้งค่าสตริงของคุณดังนี้:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
สร้างมุมมองข้อความบนเค้าโครงของคุณ:
<TextView android:id="@+id/song_number_and_title"/>
จากนั้นทำสิ่งนี้ในรหัสของคุณหากคุณใช้ Anko:
val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))
คุณอาจต้องรับทรัพยากรจากบริบทแอปพลิเคชัน
แต่คุณควรอ่านอีเลียส Martensonคำตอบ 'บนAndroid พหูพจน์รักษา‘ศูนย์’ มีปัญหากับการแปลค่าบางค่าเช่น "ศูนย์"
ใน res / values / string.xml
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
ในรหัส java
String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
คุณสามารถใช้MessageFormat
:
<string name="customer_address">Wellcome: {0} {1}</string>
ในรหัส Java:
String text = MessageFormat(R.string.customer_address).format("Name","Family");
API ระดับ 1:
https://developer.android.com/reference/java/text/MessageFormat.html
หากคุณต้องการเขียนเปอร์เซ็นต์ (%) ให้ทำซ้ำ:
<string name="percent">%1$d%%</string>
label.text = getString(R.string.percent, 75) // Output: 75%.
ถ้าคุณเขียนเพียงแค่คุณจะได้รับข้อผิดพลาด:%1$d%
Format string 'percent' is not a valid format string so it should not be passed to String.format
ใช่ คุณสามารถทำได้โดยไม่ต้องเขียนโค้ด Java / Kotlin ใด ๆ เพียง XML โดยใช้ไลบรารี่ขนาดเล็กที่ฉันสร้างขึ้นซึ่งจะทำที่ buildtime ดังนั้นแอปของคุณจะไม่ได้รับผลกระทบ: https://github.com/LikeTheSalad/android -string อ้างอิง
การใช้
สายของคุณ:
<resources>
<string name="app_name">My App Name</string>
<string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>
สตริงที่สร้างขึ้นหลังการสร้าง:
<!--resolved.xml-->
<resources>
<string name="welcome_message">Welcome to My App Name</string>
</resources>
วิธีแก้ปัญหาโดยตรง Kotlin:
strings.xml
<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>
kotlinActivityORFragmentFile.kt:
val username = "Andrew"
val products = 1000
val text: String = String.format(
resources.getString(R.string.customer_message), username, products )
ในไฟล์สตริงของคุณใช้สิ่งนี้
<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>
และในรหัสของคุณใช้ตาม
coinsTextTV.setText(String.format(getContext().getString(R.string.redeem_point), rewardPoints.getReward_points()
, rewardPoints.getConversion_rate(), getString(R.string.rs)));
รุ่น Kotlin ของคำตอบที่ยอมรับ ...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
resources.getString(int, ... args)
String.format
ไม่มี kotlin เฉพาะในรหัสนี้อย่างใดอย่างอื่นแล้วval
คำหลัก ดูคำตอบของ msbodw001