ทรัพยากรคือไฟล์เพิ่มเติมและเนื้อหาแบบคงที่ที่โค้ดของคุณใช้ เช่น บิตแมป สตริงของอินเทอร์เฟซผู้ใช้ คำสั่งภาพเคลื่อนไหว และอื่นๆ
แยกทรัพยากรของแอป เช่น รูปภาพและสตริง ออกจากโค้ดเสมอ เพื่อให้คุณดูแลทรัพยากรเหล่านั้นได้อย่างอิสระ นอกจากนี้ ให้ระบุทรัพยากรทางเลือกสำหรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจงโดยจัดกลุ่มไว้ในไดเรกทอรีทรัพยากรที่มีชื่อเฉพาะ ในเวลา รันไทม์ Android จะใช้ทรัพยากรที่เหมาะสมตามการกำหนดค่าปัจจุบัน เช่น คุณอาจต้องการระบุสตริงที่แตกต่างกันโดยขึ้นอยู่กับการตั้งค่าภาษา
เมื่อส่งออกทรัพยากรของแอปแล้ว คุณจะเข้าถึงทรัพยากรเหล่านั้นได้โดยใช้รหัสทรัพยากรที่สร้างขึ้นในคลาส R ของโปรเจ็กต์
เอกสารนี้แสดงวิธีจัดกลุ่มทรัพยากรในโปรเจ็กต์ Android นอกจากนี้ ยังแสดงวิธี
ระบุทรัพยากรทางเลือกสำหรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจง แล้วเข้าถึงทรัพยากรเหล่านั้นจาก
โค้ดแอปหรือไฟล์ XML อื่นๆ
ประเภททรัพยากรของกลุ่ม
วางทรัพยากรแต่ละประเภทไว้ในไดเรกทอรีย่อยที่เฉพาะเจาะจงของไดเรกทอรี res/ ของโปรเจ็กต์ ตัวอย่างเช่น นี่คือลำดับชั้นของไฟล์สำหรับโปรเจ็กต์ง่ายๆ
MyProject/
src/
MyActivity.kt
res/
drawable/
graphic.png
mipmap/
icon.png
values/
strings.xml
ไดเรกทอรี res/ มีทรัพยากรทั้งหมดในไดเรกทอรีย่อย ซึ่งได้แก่ ทรัพยากรรูปภาพ ไดเรกทอรี mipmap/ สำหรับไอคอนตัวเรียกใช้ และไฟล์ทรัพยากรสตริง ชื่อไดเรกทอรีทรัพยากรมีความสำคัญและอธิบายไว้ในตารางที่ 1
หมายเหตุ: ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้โฟลเดอร์ mipmap ได้ที่ วางไอคอนแอปในไดเรกทอรี mipmap
ตารางที่ 1 ไดเรกทอรีทรัพยากร
ที่รองรับภายในไดเรกทอรีโปรเจ็กต์ res/
| ไดเรกทอรี | ประเภทแหล่งข้อมูล |
|---|---|
drawable/ |
ไฟล์บิตแมป (PNG,
ดูข้อมูลเพิ่มเติมได้ที่ทรัพยากร Drawable |
mipmap/ |
ไฟล์ Drawable สำหรับความหนาแน่นของไอคอน Launcher ที่แตกต่างกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการไอคอนตัวเรียกใช้ด้วยmipmap/โฟลเดอร์ได้ที่
วางไอคอนแอปใน
ไดเรกทอรี mipmap |
raw/ |
ไฟล์ใดก็ได้ที่จะบันทึกในรูปแบบดิบ หากต้องการเปิดแหล่งข้อมูลเหล่านี้ด้วยข้อมูลดิบ
อย่างไรก็ตาม หากคุณต้องการเข้าถึงชื่อไฟล์และลำดับชั้นของไฟล์ต้นฉบับ ให้พิจารณา
บันทึกทรัพยากรในไดเรกทอรี |
values/ |
ไฟล์ XML ที่มีค่าอย่างง่าย เช่น สตริง จำนวนเต็ม และสี ในขณะที่ไฟล์ทรัพยากร XML ใน เนื่องจากทรัพยากรแต่ละรายการกำหนดด้วยองค์ประกอบ XML ของตัวเอง คุณจึงตั้งชื่อไฟล์ได้ตามต้องการและวางทรัพยากรประเภทต่างๆ ไว้ในไฟล์เดียวได้ อย่างไรก็ตาม เพื่อความชัดเจน คุณอาจ ต้องการวางประเภททรัพยากรที่ไม่ซ้ำกันในไฟล์ต่างๆ ตัวอย่างเช่น รูปแบบการตั้งชื่อไฟล์ สำหรับทรัพยากรที่คุณสร้างในไดเรกทอรีนี้มีดังนี้
ดูข้อมูลเพิ่มเติมได้ที่ทรัพยากรสตริง ทรัพยากรสไตล์ และ ประเภททรัพยากรอื่นๆ |
xml/ |
ไฟล์ XML ที่กำหนดเองซึ่งอ่านได้ขณะรันไทม์โดยการเรียก Resources.getXML ต้องบันทึกไฟล์การกำหนดค่า XML ต่างๆ ไว้ที่นี่
|
font/ |
ไฟล์แบบอักษรที่มีนามสกุล เช่น TTF, OTF
หรือ TTC หรือไฟล์ XML ที่
มีองค์ประกอบ <font-family> ดูข้อมูลเพิ่มเติมเกี่ยวกับ
แบบอักษรเป็นทรัพยากรได้ที่
เพิ่มแบบอักษรเป็นทรัพยากร XML
|
ข้อควรระวัง: ห้ามบันทึกไฟล์ทรัพยากรไว้ในไดเรกทอรี
res/ โดยตรง ซึ่งทำให้เกิดข้อผิดพลาดของคอมไพเลอร์
ทรัพยากรที่คุณบันทึกไว้ในไดเรกทอรีย่อยที่กำหนดไว้ในตารางที่ 1 คือทรัพยากรเริ่มต้น กล่าวคือ ทรัพยากรเหล่านี้จะกำหนดการออกแบบและเนื้อหาเริ่มต้นสำหรับแอป อย่างไรก็ตาม อุปกรณ์ที่ใช้ Android ประเภทต่างๆ อาจต้องใช้ทรัพยากรประเภทต่างๆ
เช่น คุณสามารถระบุทรัพยากรสตริงที่แตกต่างกัน ซึ่งแปลข้อความในอินเทอร์เฟซผู้ใช้ตามการตั้งค่าภาษาของอุปกรณ์
หมายเหตุ: ใน Compose ระบบจะประกาศ UI, ภาพเคลื่อนไหว และสีที่ขับเคลื่อนด้วยสถานะใน Kotlin ดังนั้นไดเรกทอรี
layout/, menu/, anim/, animator/
และ color/ จึงล้าสมัยสำหรับแอปสมัยใหม่ ดูข้อมูลเพิ่มเติมได้ที่ภาพเคลื่อนไหวใน Compose และโครงสร้างของธีมใน Compose
จัดหาแหล่งข้อมูลทางเลือก
แอปส่วนใหญ่มีทรัพยากรทางเลือกเพื่อรองรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจง เช่น ใส่ทรัพยากร Drawable ทางเลือกสำหรับความหนาแน่นของหน้าจอที่แตกต่างกัน และทรัพยากรสตริงทางเลือกสำหรับภาษาต่างๆ ในขณะรันไทม์ Android จะตรวจหาการกำหนดค่าอุปกรณ์ปัจจุบันและโหลด ทรัพยากรที่เหมาะสมสำหรับแอป
หากต้องการระบุทางเลือกที่เฉพาะเจาะจงกับการกำหนดค่าสำหรับชุดทรัพยากร ให้ทำดังนี้
- สร้างไดเรกทอรีใหม่ใน
res/โดยตั้งชื่อในรูปแบบ<resources_name>-<qualifier><resources_name>คือชื่อไดเรกทอรีของทรัพยากรเริ่มต้นที่เกี่ยวข้อง (กำหนดไว้ในตารางที่ 1)<qualifier>คือชื่อที่ระบุการกำหนดค่าแต่ละรายการ ซึ่งจะใช้ทรัพยากรเหล่านี้ (กำหนดไว้ในตารางที่ 2)
คุณต่อท้าย
<qualifier>ได้มากกว่า 1 รายการ คั่นแต่ละรายการ ด้วยขีดกลางข้อควรระวัง: เมื่อต่อท้ายตัวระบุหลายรายการ คุณต้อง จัดเรียงตัวระบุตามลำดับเดียวกับที่แสดงในตารางที่ 2 หากมีการจัดลำดับตัวระบุไม่ถูกต้อง ระบบจะไม่สนใจทรัพยากร
- บันทึกแหล่งข้อมูลสำรองที่เหมาะสมในไดเรกทอรีใหม่นี้ ไฟล์ทรัพยากรต้องมีชื่อเหมือนกับไฟล์ทรัพยากรเริ่มต้นทุกประการ
ตัวอย่างแหล่งข้อมูลเริ่มต้นและแหล่งข้อมูลทางเลือกมีดังนี้
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
ตัวระบุ hdpi แสดงว่าทรัพยากรในไดเรกทอรีนั้นมีไว้สำหรับอุปกรณ์ที่มี
หน้าจอความหนาแน่นสูง รูปภาพในไดเรกทอรีที่วาดได้เหล่านี้มีขนาดสำหรับความหนาแน่นของหน้าจอที่เฉพาะเจาะจง แต่ชื่อไฟล์จะเหมือนกันทุกประการ ด้วยวิธีนี้ รหัสทรัพยากรที่คุณใช้เพื่ออ้างอิงรูปภาพ icon.png หรือ background.png จะเหมือนกันเสมอ Android จะเลือกเวอร์ชันของทรัพยากรแต่ละรายการที่ตรงกับอุปกรณ์ปัจจุบันมากที่สุดโดยการเปรียบเทียบข้อมูลการกำหนดค่าอุปกรณ์กับตัวระบุในชื่อไดเรกทอรีทรัพยากร
ข้อควรระวัง: เมื่อกำหนดทรัพยากรทางเลือก โปรดตรวจสอบว่าคุณได้กำหนดทรัพยากรในการกำหนดค่าเริ่มต้นด้วย ไม่เช่นนั้น แอปอาจพบข้อยกเว้นรันไทม์
เมื่ออุปกรณ์เปลี่ยนการกำหนดค่า เช่น หากคุณเพิ่มสตริงลงใน only
values-en แต่ไม่ได้เพิ่มลงใน values แอปอาจพบข้อยกเว้น
Resource Not Found เมื่อผู้ใช้เปลี่ยนภาษาของระบบเริ่มต้น
ตารางที่ 2 แสดงตัวระบุการกำหนดค่าตามลำดับความสำคัญ คุณ เพิ่มตัวระบุหลายรายการลงในชื่อไดเรกทอรีเดียวได้โดยคั่นตัวระบุแต่ละรายการด้วยขีดกลาง หากใช้ ตัวระบุหลายรายการสำหรับไดเรกทอรีทรัพยากร คุณต้องเพิ่มตัวระบุเหล่านั้นลงในชื่อไดเรกทอรีตามลำดับที่ แสดงในตาราง
ตารางที่ 2 ชื่อ ตัวระบุการกำหนดค่า
| การกำหนดค่า | ค่าตัวระบุ | คำอธิบาย |
|---|---|---|
| MCC และ MNC | ตัวอย่างmcc310mcc208-mnc00
|
รหัสโทรศัพท์มือถือของประเทศ (MCC) ตามด้วยรหัสระบุเครือข่ายมือถือ (MNC) ซึ่งไม่บังคับ
จากซิมการ์ดในอุปกรณ์ เช่น หากอุปกรณ์ใช้การเชื่อมต่อวิทยุ (เช่น โทรศัพท์ GSM) ค่า MCC และ MNC จะมาจากซิมการ์ด นอกจากนี้ คุณยังใช้ MCC เพียงอย่างเดียวได้ด้วย เช่น เพื่อรวมแหล่งข้อมูลทางกฎหมายเฉพาะประเทศไว้ในแอป หากต้องการระบุตามภาษาเท่านั้น ให้ใช้ตัวระบุภาษา สคริปต์ (ไม่บังคับ) และภูมิภาค (ไม่บังคับ) แทน หากใช้ตัวระบุ MCC และ MNC ให้ใช้ด้วยความระมัดระวังและทดสอบว่าทำงานได้ตามที่คาดไว้ ดูฟิลด์การกำหนดค่า |
| ภาษา สคริปต์ (ไม่บังคับ) และภูมิภาค (ไม่บังคับ) | ตัวอย่างenfren-rUSfr-rFRfr-rCAb+enb+en+USb+es+419b+zh+Hantb+sr+Latn+RS |
ภาษาจะกำหนดโดยรหัสภาษาแบบ 2 ตัวอักษรตามมาตรฐาน ISO 639-1 ซึ่งอาจตามด้วยรหัสภูมิภาคแบบ 2 ตัวอักษรตามมาตรฐาน ISO 3166-1-alpha-2 (นำหน้าด้วย รหัสไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คำนำหน้า Android 7.0 (ระดับ API 24) ได้เปิดตัวการรองรับแท็กภาษา BCP 47 ซึ่งคุณใช้เพื่อระบุทรัพยากรที่เจาะจงภาษาและภูมิภาคได้ แท็กภาษาประกอบด้วยลำดับของ แท็กย่อยอย่างน้อย 1 รายการ ซึ่งแต่ละรายการจะปรับแต่งหรือจำกัดช่วงของ ภาษาที่ระบุโดยแท็กโดยรวม ดูข้อมูลเพิ่มเติมเกี่ยวกับ แท็กภาษาได้ที่แท็กสำหรับระบุภาษา หากต้องการใช้แท็กภาษา BCP 47 ให้ต่อ แท็กภาษาอาจเปลี่ยนแปลงได้ตลอดอายุของแอป หาก ผู้ใช้เปลี่ยนภาษาในการตั้งค่าระบบ ดูข้อมูลเกี่ยวกับ วิธีที่การเปลี่ยนแปลงนี้อาจส่งผลต่อแอปของคุณในระหว่างรันไทม์ได้ที่จัดการ การเปลี่ยนแปลงการกำหนดค่า ดูคำแนะนำฉบับสมบูรณ์เกี่ยวกับการแปลแอปเป็นภาษาอื่นๆ ได้ที่แปลแอป ดู |
| เพศทางไวยากรณ์ | masculinefeminineneuter |
เพศทางไวยากรณ์ของผู้ใช้ ใช้สำหรับภาษาที่มีเพศทางไวยากรณ์ เช่น หากต้องการจัดหาแหล่งข้อมูลที่แตกต่างกันสำหรับผู้ใช้ที่พูดภาษาฝรั่งเศส คุณสามารถใช้ไดเรกทอรีต่อไปนี้
ดูปรับแต่ง UI ของแอปด้วยเพศตามหลักไวยากรณ์ นอกจากนี้ โปรดดูวิธีการกำหนดค่า เพิ่มใน API ระดับ 34 |
| Wide Color Gamut |
widecgnowidecg
|
เพิ่มในระดับ API 26 ดู |
| รองรับ High Dynamic Range (HDR) |
highdrlowdr
|
เพิ่มในระดับ API 26 ดู |
| โหมด UI |
cardesktelevisionappliancewatchvrheadset
|
เพิ่มในระดับ API 8, เพิ่มโทรทัศน์ในระดับ API 13, เพิ่มเครื่องใช้ไฟฟ้าในระดับ API 16, เพิ่มนาฬิกา ในระดับ API 20, เพิ่ม VRheadset ในระดับ API 26 ดูข้อมูลเกี่ยวกับวิธีที่แอปตอบสนองเมื่อเสียบอุปกรณ์เข้ากับแท่นวางหรือนำออกจากแท่นวางได้ที่กำหนดและตรวจสอบสถานะและประเภทการเชื่อมต่อแท่นวาง ค่านี้อาจเปลี่ยนแปลงได้ตลอดอายุการใช้งานของแอปหากผู้ใช้วางอุปกรณ์ไว้ใน
แท่นวาง คุณเปิดหรือปิดใช้โหมดบางโหมดได้โดยใช้
|
| โหมดกลางคืน |
nightnotnight
|
เพิ่มใน API ระดับ 8 ซึ่งอาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากปล่อยให้โหมดกลางคืนอยู่ในโหมดอัตโนมัติ (ค่าเริ่มต้น) ในกรณีนี้ โหมดจะเปลี่ยนไปตามช่วงเวลาของวัน คุณเปิดหรือปิดใช้โหมดนี้ได้โดยใช้ |
| ความหนาแน่นของพิกเซลหน้าจอ (dpi) |
ldpimdpihdpixhdpixxhdpixxxhdpinodpitvdpianydpinnndpi
|
อัตราส่วนการปรับขนาดระหว่างความหนาแน่นหลัก 6 ระดับคือ 3:4:6:8:12:16 (ไม่รวมความหนาแน่น tvdpi) ดังนั้น บิตแมปขนาด 9x9 ใน ldpi จะเป็น 12x12 ใน mdpi, 18x18 ใน hdpi, 24x24 ใน xhdpi และอื่นๆ หมายเหตุ: การใช้ตัวระบุความหนาแน่นไม่ได้หมายความว่าทรัพยากรจะใช้ได้เฉพาะกับหน้าจอที่มีความหนาแน่นดังกล่าวเท่านั้น หากคุณไม่ได้ระบุทรัพยากรสำรองที่มีตัวระบุที่ตรงกับการกำหนดค่าอุปกรณ์ปัจจุบันมากกว่า ระบบจะใช้ทรัพยากรที่ตรงกันมากที่สุด ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการความหนาแน่นของหน้าจอที่แตกต่างกันและวิธีที่ Android อาจปรับขนาดบิตแมปให้พอดีกับความหนาแน่นปัจจุบันได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ |
| ประเภทหน้าจอสัมผัส |
notouchfinger
|
ดูฟิลด์กำหนดค่า |
| ความพร้อมใช้งานของแป้นพิมพ์ |
keysexposedkeyshiddenkeyssoft
|
หากคุณระบุ ค่านี้อาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากผู้ใช้เปิดแป้นพิมพ์ฮาร์ดแวร์ ดูข้อมูลเกี่ยวกับผลกระทบต่อแอปของคุณในระหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า ดูฟิลด์การกำหนดค่า |
| วิธีการป้อนข้อความหลัก |
nokeysqwerty12key
|
ดู |
| ความพร้อมใช้งานของปุ่มนำทาง |
navexposednavhidden
|
ค่านี้อาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอป หากผู้ใช้แสดงคีย์การนำทาง ดูข้อมูลเกี่ยวกับผลกระทบต่อแอปของคุณในระหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า ดู |
| วิธีการนำทางหลักแบบไม่สัมผัส |
nonavdpadtrackballwheel
|
ดู |
| เวอร์ชันของแพลตฟอร์ม (ระดับ API) | ตัวอย่างv3v4v7ฯลฯ |
ระดับ API ที่อุปกรณ์รองรับ เช่น |
หมายเหตุ: Android บางเวอร์ชันไม่รองรับตัวระบุทั้งหมด การใช้ตัวระบุใหม่จะเพิ่มตัวระบุเวอร์ชันแพลตฟอร์มโดยนัย เพื่อให้รุ่นเก่าๆ สามารถละเว้นได้ โปรดระบุชุดทรัพยากรเริ่มต้น (ชุดทรัพยากรที่ไม่มีตัวระบุ) เสมอเพื่อหลีกเลี่ยงปัญหา ดูข้อมูลเพิ่มเติมได้ที่ส่วนเกี่ยวกับการมอบความเข้ากันได้ของอุปกรณ์ที่ดีที่สุดด้วย แหล่งข้อมูล
ในแอป Compose คุณไม่จำเป็นต้องใช้ตัวระบุการกำหนดค่าที่เกี่ยวข้องกับเลย์เอาต์และมิติข้อมูล แม้ว่าจะมีอยู่ แต่ก็ได้รับการยกเว้นจากตารางที่ 2 คุณสมบัติเหล่านี้ ได้แก่ ทิศทางเลย์เอาต์ ความกว้างที่เล็กที่สุด ความกว้างที่ใช้ได้ ความสูงที่ใช้ได้ ขนาดหน้าจอ สัดส่วนภาพของหน้าจอ หน้าจอทรงกลม และการวางแนวหน้าจอ ดูตารางทั้งหมดของตัวระบุการกำหนดค่าตามลำดับความสำคัญได้ที่ ภาพรวมของทรัพยากรแอป (มุมมอง)
กฎชื่อตัวระบุ
กฎบางอย่างเกี่ยวกับการใช้ชื่อตัวระบุการกำหนดค่ามีดังนี้
- คุณระบุตัวระบุหลายรายการสำหรับชุดทรัพยากรเดียวได้โดยคั่นด้วยขีดกลาง เช่น
drawable-en-rUS-nightจะมีผลกับอุปกรณ์ที่ใช้ภาษาอังกฤษแบบสหรัฐอเมริกาในโหมดกลางคืน - โดยตัวระบุต้องอยู่ในลำดับที่ระบุไว้ในตารางที่ 2
- ไม่ถูกต้อง:
drawable-hdpi-night/ - ถูกต้อง:
drawable-night-hdpi/
- ไม่ถูกต้อง:
- คุณจะซ้อนไดเรกทอรีทรัพยากรทางเลือกไม่ได้ ตัวอย่างเช่น คุณจะใช้ชื่อต่อไปนี้ไม่ได้
res/drawable/drawable-en/ - การป้อนค่านั้นไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คอมไพเลอร์ทรัพยากรจะแปลงชื่อไดเรกทอรีเป็นตัวพิมพ์เล็กก่อนประมวลผลเพื่อหลีกเลี่ยงปัญหาในระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ การใช้อักษรตัวพิมพ์ใหญ่ในชื่อมีไว้เพื่อให้อ่านง่ายขึ้นเท่านั้น
- ระบบรองรับค่าเดียวสำหรับตัวระบุประเภทแต่ละรายการ เช่น หากต้องการใช้ไฟล์ Drawable เดียวกันสำหรับสเปนและฝรั่งเศส คุณจะมีไดเรกทอรีชื่อ
drawable-es-fr/ไม่ได้ แต่คุณต้องมีไดเรกทอรีทรัพยากร 2 รายการ เช่นdrawable-es/และdrawable-fr/ซึ่งมีไฟล์ที่เหมาะสม
หลังจากบันทึกทรัพยากรทางเลือกไว้ในไดเรกทอรีที่ตั้งชื่อตามตัวระบุเหล่านี้แล้ว Android จะใช้ทรัพยากรในแอปโดยอัตโนมัติตามการกำหนดค่าอุปกรณ์ปัจจุบัน ทุกครั้งที่มีการขอทรัพยากร Android จะตรวจสอบไดเรกทอรีทรัพยากรสำรองที่มีไฟล์ทรัพยากรที่ขอ แล้วค้นหาทรัพยากรที่ตรงกันมากที่สุด
หากไม่มีทรัพยากรอื่นที่ตรงกับการกำหนดค่าอุปกรณ์หนึ่งๆ Android จะใช้ทรัพยากรเริ่มต้นที่เกี่ยวข้อง ซึ่งก็คือ ชุดทรัพยากรสำหรับประเภททรัพยากรหนึ่งๆ ที่ไม่มีตัวระบุการกำหนดค่า
สร้างทรัพยากรชื่อแทน
เมื่อมีทรัพยากรที่ต้องการใช้สำหรับการกำหนดค่าอุปกรณ์มากกว่า 1 รายการ แต่ไม่ต้องการระบุเป็นทรัพยากรเริ่มต้น คุณไม่จำเป็นต้องใส่ทรัพยากรเดียวกันในไดเรกทอรีทรัพยากรทางเลือกมากกว่า 1 ไดเรกทอรี แต่คุณสามารถสร้าง ทรัพยากร ทางเลือกที่ทำหน้าที่เป็นนามแฝงสำหรับทรัพยากรที่บันทึกไว้ในไดเรกทอรีทรัพยากรเริ่มต้นได้
Drawable
ตัวอย่างเช่น สมมติว่าคุณมีไอคอนแอป icon.png และต้องการเวอร์ชันที่ไม่ซ้ำกัน
สำหรับภาษาต่างๆ อย่างไรก็ตาม ภาษาอังกฤษ (แคนาดา) และภาษาฝรั่งเศส (แคนาดา) ต้องใช้เวอร์ชันเดียวกัน คุณไม่จำเป็นต้องคัดลอกรูปภาพเดียวกัน
ลงในไดเรกทอรีทรัพยากรสำหรับทั้งภาษาอังกฤษ (แคนาดา) และภาษาฝรั่งเศส (แคนาดา)
แต่คุณสามารถบันทึกรูปภาพที่ใช้สำหรับทั้ง 2 อย่างโดยใช้ชื่ออื่น
icon.png เช่น icon_ca.png แล้ววางไว้ในไดเรกทอรี res/drawable/ เริ่มต้น จากนั้นสร้างไฟล์ icon.xml ใน
res/drawable-en-rCA/ และ res/drawable-fr-rCA/ ที่อ้างอิงถึงทรัพยากร icon_ca.png
โดยใช้องค์ประกอบ <bitmap>
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon_ca" />
ซึ่งจะช่วยให้คุณจัดเก็บไฟล์ PNG เพียงเวอร์ชันเดียวและไฟล์ XML ขนาดเล็ก 2 ไฟล์ที่ชี้ไปยังไฟล์ PNG นั้น
จากนั้นคุณจะใช้ painterResource(R.drawable.icon) ได้ และระบบจะเลือกไฟล์ที่
เหมาะสมเมื่อตรวจพบภาษา
สตริงและค่าอย่างง่ายอื่นๆ
หากต้องการสร้างชื่อแทนให้กับสตริงที่มีอยู่ ให้ใช้รหัสทรัพยากรของสตริงที่ต้องการเป็นค่าสำหรับสตริงใหม่
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
ตอนนี้ทรัพยากร R.string.hi เป็นชื่อแทนของ R.string.hello แล้ว
ค่าอื่นๆ ที่เรียบง่ายจะทำงานในลักษณะเดียวกัน เช่น สี
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
เข้าถึงทรัพยากรของแอป
เมื่อระบุทรัพยากรในแอปพลิเคชันแล้ว คุณจะใช้ทรัพยากรนั้นได้โดย
อ้างอิงรหัสทรัพยากร รหัสทรัพยากรทั้งหมดจะกำหนดไว้ในคลาส R ของโปรเจ็กต์ ซึ่งเครื่องมือ aapt จะสร้างขึ้นโดยอัตโนมัติ
เมื่อคอมไพล์แอปพลิเคชัน aapt จะสร้างคลาส R ซึ่งมี รหัสทรัพยากรสำหรับทรัพยากรทั้งหมดในไดเรกทอรี res/ สำหรับทรัพยากรแต่ละประเภท
จะมีRคลาสย่อย เช่น
R.drawable สำหรับทรัพยากรที่วาดได้ทั้งหมด และสำหรับทรัพยากรแต่ละรายการของประเภทนั้น จะมี
จำนวนเต็มแบบคงที่ เช่น R.drawable.icon จำนวนเต็มนี้คือรหัสทรัพยากรที่คุณใช้
เพื่อดึงข้อมูลทรัพยากรได้
แม้ว่าคลาส R จะเป็นที่ที่ระบุรหัสทรัพยากร แต่คุณไม่จำเป็นต้องค้นหารหัสทรัพยากรในคลาสนี้ รหัสทรัพยากรประกอบด้วยข้อมูลต่อไปนี้เสมอ
- ประเภททรัพยากร: ทรัพยากรแต่ละรายการจะจัดกลุ่มเป็น "ประเภท" เช่น
stringหรือdrawable - ชื่อทรัพยากร ซึ่งเป็นชื่อไฟล์ ไม่รวมนามสกุล
เข้าถึงทรัพยากรใน Compose
Jetpack Compose มีฟังก์ชันในตัวที่รับรู้ได้ถึงฟังก์ชันที่ประกอบกันได้เพื่อเข้าถึงทรัพยากรอย่างปลอดภัย
- Strings:
stringResource(id = R.string.hello)
- Drawable:
painterResource(id = R.drawable.my_icon)
เข้าถึงทรัพยากรในโค้ดที่ไม่ใช่ UI
หากต้องการเข้าถึงทรัพยากรภายนอกลําดับชั้น UI เช่น ใน
ViewModel, Repository หรือ Service ของระบบ คุณสามารถ
แก้ไขได้โดยใช้ Context
// Retrieve a localized string resource val greeting = context.getString(R.string.hello_world)
นอกจากนี้ คุณยังเรียกข้อมูลทรัพยากรแต่ละรายการได้โดยใช้เมธอดใน Resources ซึ่งคุณรับอินสแตนซ์ได้ด้วย getResources
ไวยากรณ์
ไวยากรณ์ในการอ้างอิงทรัพยากรในโค้ดมีดังนี้
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>คือชื่อของแพ็กเกจที่มีทรัพยากรอยู่ (ไม่จำเป็นต้องระบุเมื่ออ้างอิงทรัพยากรจากแพ็กเกจของคุณเอง)<resource_type>คือคลาสย่อยRสำหรับประเภททรัพยากร<resource_name>คือชื่อไฟล์ทรัพยากร ที่ไม่มีนามสกุลหรือค่าแอตทริบิวต์android:nameในองค์ประกอบ XML สำหรับ ค่าอย่างง่าย
ดูข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากรแต่ละประเภทและวิธีอ้างอิงได้ที่ ทรัพยากรใน Compose
เข้าถึงไฟล์ต้นฉบับ
แม้จะไม่ค่อยเกิดขึ้น แต่คุณอาจต้องเข้าถึงไฟล์และไดเรกทอรีต้นฉบับ หากคุณทำเช่นนั้น การบันทึกไฟล์ใน res/ จะใช้ไม่ได้ เนื่องจากวิธีเดียวในการอ่านทรัพยากรจาก
res/ คือการใช้รหัสทรัพยากร แต่คุณสามารถบันทึกทรัพยากรไว้ในไดเรกทอรี
assets/ แทนได้
ระบบไม่กำหนดรหัสทรัพยากรให้กับไฟล์ที่บันทึกไว้ในไดเรกทอรี assets/ ดังนั้นคุณจึงอ้างอิงไฟล์เหล่านั้นผ่านคลาส R หรือจากทรัพยากร XML ไม่ได้ แต่คุณสามารถ ค้นหาไฟล์ในไดเรกทอรี assets/ เหมือนระบบไฟล์ปกติและอ่านข้อมูลดิบโดยใช้ AssetManager แทน
อย่างไรก็ตาม หากคุณต้องการเพียงความสามารถในการอ่านข้อมูลดิบ (เช่น ไฟล์วิดีโอหรือไฟล์เสียง)
ให้บันทึกไฟล์ในไดเรกทอรี res/raw/ และอ่านสตรีมไบต์โดยใช้
openRawResource
เข้าถึงแหล่งข้อมูลของแพลตฟอร์ม
Android มีทรัพยากรมาตรฐานหลายอย่าง เช่น สไตล์และธีมของระบบ หากต้องการเข้าถึง
ให้ระบุการอ้างอิงทรัพยากรด้วยคลาส android package ตัวอย่างเช่น
painterResource(android.R.drawable.ic_menu_info_details)
มอบความเข้ากันได้ของอุปกรณ์ที่ดีที่สุดด้วยทรัพยากร
เพื่อให้แอปของคุณรองรับการกำหนดค่าอุปกรณ์หลายแบบ คุณจึงต้องระบุทรัพยากรเริ่มต้นสำหรับทรัพยากรแต่ละประเภทที่แอปใช้เสมอ
เช่น หากแอปของคุณรองรับหลายภาษา ให้ใส่ไดเรกทอรี values/ (ที่บันทึกสตริง) โดยไม่มีตัวระบุภาษาและภูมิภาคเสมอ แต่หากคุณใส่ไฟล์สตริงทั้งหมด
ในไดเรกทอรีที่มีตัวระบุภาษาและภูมิภาค แอปจะขัดข้องเมื่อเรียกใช้
ในอุปกรณ์ที่ตั้งค่าเป็นภาษาที่สตริงไม่รองรับ
ตราบใดที่คุณระบุทรัพยากรเริ่มต้น
values/ แอปก็จะทำงานได้อย่างถูกต้อง แม้ว่าผู้ใช้จะไม่เข้าใจภาษาที่แอปแสดงก็ตาม
ซึ่งดีกว่าการเกิดข้อขัดข้อง
การระบุทรัพยากรเริ่มต้นมีความสำคัญไม่เพียงเพราะแอปอาจทำงานในการกำหนดค่าที่คุณไม่ได้คาดการณ์ไว้ แต่ยังเป็นเพราะ Android เวอร์ชันใหม่อาจเพิ่มตัวระบุการกำหนดค่าที่เวอร์ชันต่ำกว่าไม่รองรับ หากคุณใช้ตัวระบุทรัพยากรใหม่ แต่ยังคงความเข้ากันได้ของโค้ดกับ Android เวอร์ชันที่ต่ำกว่า เมื่อ Android เวอร์ชันที่ต่ำกว่า เรียกใช้แอปของคุณ แอปจะขัดข้องหากคุณไม่ได้ระบุทรัพยากรเริ่มต้น เนื่องจาก ใช้ทรัพยากรที่มีชื่อตามตัวระบุใหม่ไม่ได้
ตัวอย่างเช่น หากตั้งค่า minSdkVersion เป็น 4 และคุณมีสิทธิ์ใช้ทรัพยากรที่วาดได้ทั้งหมดโดยใช้โหมดกลางคืน (night หรือ notnight ซึ่งเพิ่มในระดับ API 8) อุปกรณ์ระดับ API 4 จะเข้าถึงทรัพยากรที่วาดได้ไม่ได้และจะเกิดข้อขัดข้อง ในกรณีนี้ คุณอาจต้องการให้ notnight เป็นทรัพยากรเริ่มต้น ดังนั้นให้ยกเว้นตัวระบุนั้นและวางทรัพยากรที่วาดได้ไว้ใน drawable/ หรือ drawable-night/
กล่าวโดยย่อคือ เพื่อให้มั่นใจว่าอุปกรณ์จะเข้ากันได้ดีที่สุด ให้ระบุทรัพยากรเริ่มต้นสำหรับทรัพยากรที่แอปของคุณต้องใช้ในการทำงานอย่างเหมาะสมเสมอ จากนั้นสร้างทรัพยากรสำรอง สำหรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจงโดยใช้ตัวระบุการกำหนดค่า
อย่างไรก็ตาม มีข้อยกเว้นสำหรับกฎนี้คือ หาก minSdkVersion ของแอปเป็น 4 หรือมากกว่า คุณไม่จำเป็นต้องมีทรัพยากร Drawable เริ่มต้นเมื่อระบุทรัพยากร Drawable ทางเลือกที่มีตัวระบุความหนาแน่นของหน้าจอ แม้จะไม่มีทรัพยากร Drawable เริ่มต้น แต่ Android ก็สามารถค้นหาความหนาแน่นของหน้าจอทางเลือกที่เหมาะสมที่สุดและปรับขนาดบิตแมปได้ตามต้องการ
อย่างไรก็ตาม เพื่อให้ได้รับประสบการณ์การใช้งานที่ดีที่สุดในอุปกรณ์ทุกประเภท
ให้ระบุภาพวาดแทนสำหรับความหนาแน่นทั้ง 3 ประเภท
วิธีที่ Android ค้นหาทรัพยากรที่ตรงกันที่สุด
เมื่อคุณขอทรัพยากรที่คุณระบุทรัพยากรทางเลือก Android จะเลือกทรัพยากรทางเลือกที่จะใช้ในรันไทม์ตามการกำหนดค่าอุปกรณ์ปัจจุบัน หากต้องการแสดงให้เห็นว่า Android เลือกทรัพยากรทางเลือกอย่างไร ให้สมมติว่าไดเรกทอรี Drawable ต่อไปนี้ แต่ละไดเรกทอรีมีรูปภาพเดียวกันในเวอร์ชันต่างๆ
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/
และสมมติว่าการกำหนดค่าอุปกรณ์เป็นดังนี้
Locale = en-GB
โหมดกลางคืน = night
ความหนาแน่นพิกเซลของหน้าจอ = hdpi
ประเภทหน้าจอสัมผัส = notouch
วิธีการป้อนข้อความหลัก = 12key
Android จะเลือก
drawable จาก drawable-en-night โดยการเปรียบเทียบการกำหนดค่าอุปกรณ์กับทรัพยากรทางเลือกที่มี
ระบบจะตัดสินใจว่าจะใช้ทรัพยากรใดโดยใช้ตรรกะต่อไปนี้
รูปที่ 2 โฟลว์ชาร์ตแสดงวิธีที่ Android ค้นหา ทรัพยากรที่ตรงกันมากที่สุด
- นำไฟล์ทรัพยากรที่ขัดแย้งกับการกำหนดค่าอุปกรณ์ออก
ระบบจะนำไดเรกทอรี
drawable-fr-rCA/ออกเนื่องจากขัดแย้งกับภาษาen-GBdrawable/ drawable-en/
drawable-fr-rCA/drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/ข้อยกเว้น: ความหนาแน่นของพิกเซลหน้าจอเป็นคุณสมบัติเดียวที่ไม่ได้ ถูกนำออกเนื่องจากความขัดแย้ง แม้ว่าความหนาแน่นของหน้าจอของอุปกรณ์จะเป็น hdpi แต่ระบบก็ไม่ได้นำ
drawable-night-ldpi/ออกเนื่องจากถือว่าความหนาแน่นของหน้าจอทุกระดับตรงกันในตอนนี้ ดูข้อมูลได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ - ค้นหาตัวระบุที่มีลำดับความสำคัญสูงสุดถัดไปในรายการ (ตารางที่ 2) (เริ่มต้นด้วย MCC)
- ไดเรกทอรีทรัพยากรมีตัวระบุนี้ไหม
- หากไม่มี ให้กลับไปที่ขั้นตอนที่ 2 แล้วดูผู้มีสิทธิ์รายถัดไป ในตัวอย่างนี้ คำตอบคือ "ไม่" จนกว่าจะถึงตัวระบุภาษา
- หากใช่ ให้ไปที่ขั้นตอนที่ 4
- นำไดเรกทอรีทรัพยากรที่ไม่มีตัวระบุนี้ออก ในตัวอย่างนี้ ระบบ
จะนำไดเรกทอรีทั้งหมดที่ไม่มีตัวระบุภาษาออก
drawable/drawable-en/ drawable-en-night/ drawable-en-notouch-12key/drawable-night-ldpi/drawable-night-notouch-12key/ข้อยกเว้น: หากตัวระบุที่เป็นปัญหาคือความหนาแน่นพิกเซลของหน้าจอ Android จะเลือกตัวเลือกที่ตรงกับความหนาแน่นของหน้าจออุปกรณ์มากที่สุด โดยทั่วไปแล้ว Android จะชอบการลดขนาดรูปภาพต้นฉบับที่ใหญ่กว่ามากกว่าการเพิ่มขนาดรูปภาพต้นฉบับที่เล็กกว่า ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ
- ทำขั้นตอนที่ 2, 3 และ 4 ซ้ำจนกว่าจะเหลือไดเรกทอรีเพียง 1 รายการ ในตัวอย่างนี้ โหมดกลางคืน
เป็นตัวระบุถัดไปที่มีการจับคู่
ดังนั้น ระบบจะนำทรัพยากรที่ไม่ได้ระบุโหมดกลางคืนออก
drawable-en/drawable-en-night/drawable-en-notouch-12key/ไดเรกทอรีที่เหลือคือ
drawable-en-night
แม้ว่าขั้นตอนนี้จะดำเนินการกับทรัพยากรแต่ละรายการที่ขอ แต่ระบบจะเพิ่มประสิทธิภาพ บางส่วนของขั้นตอนนี้ การเพิ่มประสิทธิภาพอย่างหนึ่งคือเมื่อทราบการกำหนดค่าอุปกรณ์แล้ว ก็อาจ ตัดแหล่งข้อมูลอื่นที่ไม่มีทางตรงกันออกไป เช่น หากภาษาในการกำหนดค่าเป็นภาษาอังกฤษ ไดเรกทอรีทรัพยากรที่มีตัวระบุภาษาซึ่งตั้งค่าเป็นภาษาอื่นที่ไม่ใช่ภาษาอังกฤษจะไม่รวมอยู่ในกลุ่มทรัพยากรที่ตรวจสอบ (แม้ว่าไดเรกทอรีทรัพยากรที่ไม่มีตัวระบุภาษาจะยังรวมอยู่ก็ตาม)
เมื่อเลือกทรัพยากรตามตัวระบุขนาดหน้าจอ ระบบจะใช้ทรัพยากร ที่ออกแบบมาสำหรับหน้าจอที่มีขนาดเล็กกว่าหน้าจอปัจจุบัน หากไม่มีทรัพยากรที่ตรงกันมากกว่า เช่น หน้าจอขนาดใหญ่จะใช้ทรัพยากรหน้าจอขนาดปกติหากจำเป็น
อย่างไรก็ตาม หากแหล่งข้อมูลเดียวที่ใช้ได้มีขนาดใหญ่กว่าหน้าจอปัจจุบัน ระบบจะไม่ใช้แหล่งข้อมูลเหล่านั้น และแอปจะขัดข้องหากไม่มีแหล่งข้อมูลอื่นที่ตรงกับการกำหนดค่าอุปกรณ์ กรณีนี้จะเกิดขึ้น เช่น หากทรัพยากรเลย์เอาต์ทั้งหมดติดแท็กด้วยตัวระบุ xlarge
แต่อุปกรณ์เป็นหน้าจอขนาดปกติ
หมายเหตุ: ลำดับความสำคัญของตัวระบุ (ในตารางที่ 2) สำคัญกว่าจำนวนตัวระบุที่ตรงกับอุปกรณ์อย่างแน่นอน ในตัวอย่างก่อนหน้า ที่ขั้นตอนที่ 4
ตัวเลือกสุดท้ายในรายการมีตัวระบุ 3 รายการที่ตรงกับอุปกรณ์อย่างแน่นอน (โหมดกลางคืน
ประเภทหน้าจอสัมผัส และวิธีการป้อนข้อมูล) ในขณะที่ drawable-en มีพารามิเตอร์เพียงรายการเดียวที่ตรงกัน
(ภาษา) อย่างไรก็ตาม ภาษาจะมีความสำคัญสูงกว่าตัวระบุอื่นๆ เหล่านี้ ดังนั้น
drawable-night-notouch-12key จึงถูกตัดออก
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากรของแอปได้ที่แหล่งข้อมูลเพิ่มเติมต่อไปนี้