ภาพรวมแหล่งข้อมูลของแอป

ทรัพยากรคือไฟล์เพิ่มเติมและเนื้อหาแบบคงที่ที่โค้ดของคุณใช้ เช่น บิตแมป สตริงของอินเทอร์เฟซผู้ใช้ คำสั่งภาพเคลื่อนไหว และอื่นๆ

แยกทรัพยากรของแอป เช่น รูปภาพและสตริง ออกจากโค้ดเสมอ เพื่อให้คุณดูแลทรัพยากรเหล่านั้นได้อย่างอิสระ นอกจากนี้ ให้ระบุทรัพยากรทางเลือกสำหรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจงโดยจัดกลุ่มไว้ในไดเรกทอรีทรัพยากรที่มีชื่อเฉพาะ ในเวลา รันไทม์ 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, .9.png, JPG หรือ GIF) หรือไฟล์ XML ที่คอมไพล์เป็นทรัพยากรที่ถอนออกได้ประเภทย่อยต่อไปนี้

  • ไฟล์บิตแมป
  • Nine-patch (บิตแมปที่ปรับขนาดได้)
  • รายการของรัฐ
  • รูปทรง
  • ภาพเคลื่อนไหวที่วาดได้
  • ภาพที่วาดอื่นๆ

ดูข้อมูลเพิ่มเติมได้ที่ทรัพยากร Drawable

mipmap/ ไฟล์ Drawable สำหรับความหนาแน่นของไอคอน Launcher ที่แตกต่างกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการไอคอนตัวเรียกใช้ด้วยmipmap/โฟลเดอร์ได้ที่ วางไอคอนแอปใน ไดเรกทอรี mipmap
raw/

ไฟล์ใดก็ได้ที่จะบันทึกในรูปแบบดิบ หากต้องการเปิดแหล่งข้อมูลเหล่านี้ด้วยข้อมูลดิบ InputStream ให้เรียกใช้ Resources.openRawResourceด้วยรหัสทรัพยากร ซึ่งก็คือ R.raw.filename

อย่างไรก็ตาม หากคุณต้องการเข้าถึงชื่อไฟล์และลำดับชั้นของไฟล์ต้นฉบับ ให้พิจารณา บันทึกทรัพยากรในไดเรกทอรี assets/ แทน res/raw/ ไฟล์ใน assets/ จะไม่มี รหัสทรัพยากร คุณจึงอ่านได้โดยใช้ AssetManager เท่านั้น

values/

ไฟล์ XML ที่มีค่าอย่างง่าย เช่น สตริง จำนวนเต็ม และสี

ในขณะที่ไฟล์ทรัพยากร XML ในres/ไดเรกทอรีย่อยอื่นๆ จะกำหนดทรัพยากรเดียว ตามชื่อไฟล์ XML แต่ไฟล์ในไดเรกทอรี values/ จะอธิบายทรัพยากรหลายรายการ สำหรับไฟล์ในไดเรกทอรีนี้ องค์ประกอบย่อยแต่ละรายการขององค์ประกอบ <resources> จะกำหนดทรัพยากรเดียว เช่น องค์ประกอบ <string> จะสร้างทรัพยากร R.string และองค์ประกอบ <color> จะสร้างทรัพยากร R.color

เนื่องจากทรัพยากรแต่ละรายการกำหนดด้วยองค์ประกอบ 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 จะตรวจหาการกำหนดค่าอุปกรณ์ปัจจุบันและโหลด ทรัพยากรที่เหมาะสมสำหรับแอป

หากต้องการระบุทางเลือกที่เฉพาะเจาะจงกับการกำหนดค่าสำหรับชุดทรัพยากร ให้ทำดังนี้

  1. สร้างไดเรกทอรีใหม่ใน res/ โดยตั้งชื่อในรูปแบบ <resources_name>-<qualifier>
    • <resources_name> คือชื่อไดเรกทอรีของทรัพยากรเริ่มต้นที่เกี่ยวข้อง (กำหนดไว้ในตารางที่ 1)
    • <qualifier> คือชื่อที่ระบุการกำหนดค่าแต่ละรายการ ซึ่งจะใช้ทรัพยากรเหล่านี้ (กำหนดไว้ในตารางที่ 2)

    คุณต่อท้าย <qualifier> ได้มากกว่า 1 รายการ คั่นแต่ละรายการ ด้วยขีดกลาง

    ข้อควรระวัง: เมื่อต่อท้ายตัวระบุหลายรายการ คุณต้อง จัดเรียงตัวระบุตามลำดับเดียวกับที่แสดงในตารางที่ 2 หากมีการจัดลำดับตัวระบุไม่ถูกต้อง ระบบจะไม่สนใจทรัพยากร

  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 ตัวอย่าง
mcc310
mcc310-mnc004
mcc208-mnc00

รหัสโทรศัพท์มือถือของประเทศ (MCC) ตามด้วยรหัสระบุเครือข่ายมือถือ (MNC) ซึ่งไม่บังคับ จากซิมการ์ดในอุปกรณ์ เช่น mcc310 คือสหรัฐอเมริกาในทุกเครือข่าย mcc310-mnc004 คือสหรัฐอเมริกาใน Verizon และ mcc208-mnc00 คือฝรั่งเศสใน Orange

หากอุปกรณ์ใช้การเชื่อมต่อวิทยุ (เช่น โทรศัพท์ GSM) ค่า MCC และ MNC จะมาจากซิมการ์ด

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

ดูฟิลด์การกำหนดค่า mcc และ mnc ซึ่งระบุรหัสโทรศัพท์มือถือของประเทศ และรหัสระบุเครือข่ายมือถือปัจจุบันตามลำดับ

ภาษา สคริปต์ (ไม่บังคับ) และภูมิภาค (ไม่บังคับ) ตัวอย่าง
en
fr
en-rUS
fr-rFR
fr-rCA
b+en
b+en+US
b+es+419
b+zh+Hant
b+sr+Latn+RS

ภาษาจะกำหนดโดยรหัสภาษาแบบ 2 ตัวอักษรตามมาตรฐาน ISO 639-1 ซึ่งอาจตามด้วยรหัสภูมิภาคแบบ 2 ตัวอักษรตามมาตรฐาน ISO 3166-1-alpha-2 (นำหน้าด้วย r ตัวพิมพ์เล็ก)

รหัสไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คำนำหน้า r ใช้เพื่อแยกส่วนภูมิภาค คุณระบุภูมิภาคอย่างเดียวไม่ได้

Android 7.0 (ระดับ API 24) ได้เปิดตัวการรองรับแท็กภาษา BCP 47 ซึ่งคุณใช้เพื่อระบุทรัพยากรที่เจาะจงภาษาและภูมิภาคได้ แท็กภาษาประกอบด้วยลำดับของ แท็กย่อยอย่างน้อย 1 รายการ ซึ่งแต่ละรายการจะปรับแต่งหรือจำกัดช่วงของ ภาษาที่ระบุโดยแท็กโดยรวม ดูข้อมูลเพิ่มเติมเกี่ยวกับ แท็กภาษาได้ที่แท็กสำหรับระบุภาษา

หากต้องการใช้แท็กภาษา BCP 47 ให้ต่อ b+ กับรหัสภาษา ISO 639-1 แบบ 2 ตัวอักษร และอาจตามด้วยแท็กย่อยเพิ่มเติมที่คั่นด้วย +

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

ดูคำแนะนำฉบับสมบูรณ์เกี่ยวกับการแปลแอปเป็นภาษาอื่นๆ ได้ที่แปลแอป

ดู getLocales method ซึ่งแสดงรายการที่กำหนดของ ภาษา รายการนี้รวมถึงภาษาหลัก

เพศทางไวยากรณ์ masculine
feminine
neuter

เพศทางไวยากรณ์ของผู้ใช้ ใช้สำหรับภาษาที่มีเพศทางไวยากรณ์

เช่น หากต้องการจัดหาแหล่งข้อมูลที่แตกต่างกันสำหรับผู้ใช้ที่พูดภาษาฝรั่งเศส คุณสามารถใช้ไดเรกทอรีต่อไปนี้

res/
  values-fr/
    strings.xml (สตริงเริ่มต้นที่มีเพศที่ไม่ได้ระบุ)
  values-fr-masculine/
    strings.xml (สตริงที่มีเพศชาย)
  values-fr-feminine/
    strings.xml (สตริงที่มีเพศหญิง)
  values-fr-neuter/
    strings.xml (สตริงที่มีเพศกลาง)

ดูปรับแต่ง UI ของแอปด้วยเพศตามหลักไวยากรณ์

นอกจากนี้ โปรดดูวิธีการกำหนดค่า getGrammaticalGender ซึ่งระบุเพศตามหลักไวยากรณ์

เพิ่มใน API ระดับ 34

Wide Color Gamut widecg
nowidecg
  • widecg: จอแสดงผลที่มีช่วงสีแบบกว้าง เช่น Display P3 หรือ AdobeRGB
  • nowidecg: จอแสดงผลที่มีขอบเขตสีแคบ เช่น sRGB

เพิ่มในระดับ API 26

ดูisScreenWideColorGamutการกำหนดค่า วิธี ซึ่งระบุว่าหน้าจอมีขอบเขตสีแบบกว้างหรือไม่

รองรับ High Dynamic Range (HDR) highdr
lowdr
  • highdr: จอแสดงผลที่มีช่วงไดนามิกสูง
  • lowdr: จอแสดงผลที่มีช่วงไดนามิกต่ำ/มาตรฐาน

เพิ่มในระดับ API 26

ดูisScreenHdrวิธีการกำหนดค่า ซึ่งระบุว่าหน้าจอมีฟีเจอร์ HDR หรือไม่

โหมด UI car
desk
television
appliance
watch
vrheadset
  • car: อุปกรณ์แสดงในแท่นชาร์จในรถ
  • desk: อุปกรณ์แสดงในแท่นวางบนโต๊ะ
  • television: อุปกรณ์แสดงผลบนโทรทัศน์ ซึ่งมอบประสบการณ์การใช้งานในระยะไกล โดยมี UI อยู่บนหน้าจอขนาดใหญ่ที่ผู้ใช้อยู่ห่างออกไป และประสบการณ์การใช้งาน มุ่งเน้นไปที่ D-pad หรือการโต้ตอบอื่นๆ ที่ไม่ใช่การใช้เคอร์เซอร์เป็นหลัก
  • appliance: อุปกรณ์ทำหน้าที่เป็นเครื่องใช้ไฟฟ้าโดย ไม่มีจอแสดงผล
  • watch: อุปกรณ์มีจอแสดงผลและสวมใส่ที่ข้อมือ
  • vrheadset: อุปกรณ์แสดงในชุดหูฟัง Virtual Reality

เพิ่มในระดับ API 8, เพิ่มโทรทัศน์ในระดับ API 13, เพิ่มเครื่องใช้ไฟฟ้าในระดับ API 16, เพิ่มนาฬิกา ในระดับ API 20, เพิ่ม VRheadset ในระดับ API 26

ดูข้อมูลเกี่ยวกับวิธีที่แอปตอบสนองเมื่อเสียบอุปกรณ์เข้ากับแท่นวางหรือนำออกจากแท่นวางได้ที่กำหนดและตรวจสอบสถานะและประเภทการเชื่อมต่อแท่นวาง

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

โหมดกลางคืน night
notnight
  • night: กลางคืน
  • notnight: เวลา

เพิ่มใน API ระดับ 8

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

ความหนาแน่นของพิกเซลหน้าจอ (dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnndpi
  • ldpi: หน้าจอความหนาแน่นต่ำ ประมาณ 120 DPI
  • mdpi: หน้าจอความหนาแน่นปานกลาง (ใน HVGA แบบดั้งเดิม) ประมาณ 160 DPI
  • hdpi: หน้าจอความหนาแน่นสูง ประมาณ 240 dpi
  • xhdpi: หน้าจอความหนาแน่นสูงพิเศษ ประมาณ 320 dpi เพิ่มใน API ระดับ 8
  • xxhdpi: หน้าจอที่มีความหนาแน่นสูงมากเป็นพิเศษ ประมาณ 480 dpi เพิ่มใน API ระดับ 16
  • xxxhdpi: ความหนาแน่นสูงพิเศษ (ใช้เฉพาะไอคอน Launcher ดูรองรับความหนาแน่นของพิกเซลในระดับต่างๆ) ประมาณ 640 dpi เพิ่มใน API ระดับ 18
  • nodpi: ใช้สำหรับทรัพยากรบิตแมปที่คุณไม่ต้องการให้ปรับขนาด เพื่อให้ตรงกับความหนาแน่นของอุปกรณ์
  • tvdpi: หน้าจอที่มีความหนาแน่นระหว่าง mdpi กับ hdpi โดยประมาณ 213 dpi กลุ่มความหนาแน่นนี้ไม่ถือเป็นกลุ่มความหนาแน่น "หลัก" โดยส่วนใหญ่แล้วมีไว้สำหรับโทรทัศน์ 720p และ แอปส่วนใหญ่ไม่จำเป็นต้องใช้ สำหรับแผงทีวี 1080p ให้ใช้ xhdpi และสำหรับแผงทีวี 4K ให้ใช้ xxxhdpi เพิ่มในระดับ API 13
  • anydpi: ตรงกับความหนาแน่นของหน้าจอทั้งหมดและมีลำดับความสำคัญสูงกว่า ตัวระบุอื่นๆ ซึ่งมีประโยชน์สำหรับVector Drawable เพิ่มใน API ระดับ 21
  • nnndpi: ใช้เพื่อแสดงความหนาแน่นที่ไม่เป็นไปตามมาตรฐาน โดยที่ nnn คือความหนาแน่นของหน้าจอที่เป็นจำนวนเต็มบวก โดยส่วนใหญ่แล้วจะไม่ใช้ การใช้ที่เก็บข้อมูลความหนาแน่นมาตรฐานจะช่วยลด ค่าใช้จ่ายในการรองรับความหนาแน่นของหน้าจออุปกรณ์ต่างๆ ในตลาดได้อย่างมาก

อัตราส่วนการปรับขนาดระหว่างความหนาแน่นหลัก 6 ระดับคือ 3:4:6:8:12:16 (ไม่รวมความหนาแน่น tvdpi) ดังนั้น บิตแมปขนาด 9x9 ใน ldpi จะเป็น 12x12 ใน mdpi, 18x18 ใน hdpi, 24x24 ใน xhdpi และอื่นๆ

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการความหนาแน่นของหน้าจอที่แตกต่างกันและวิธีที่ Android อาจปรับขนาดบิตแมปให้พอดีกับความหนาแน่นปัจจุบันได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ

ประเภทหน้าจอสัมผัส notouch
finger
  • notouch: อุปกรณ์ไม่มีหน้าจอสัมผัส
  • finger: อุปกรณ์มีหน้าจอสัมผัสที่ออกแบบมาเพื่อ ใช้ผ่านการโต้ตอบโดยตรงของนิ้วผู้ใช้

ดูฟิลด์กำหนดค่า touchscreen ด้วย ซึ่งระบุประเภทหน้าจอสัมผัสในอุปกรณ์

ความพร้อมใช้งานของแป้นพิมพ์ keysexposed
keyshidden
keyssoft
  • keysexposed: อุปกรณ์มีแป้นพิมพ์ หากอุปกรณ์เปิดใช้แป้นพิมพ์เสมือน (ซึ่งมีแนวโน้มที่จะเป็นเช่นนั้น) ระบบจะใช้แป้นพิมพ์นี้แม้ว่าผู้ใช้จะไม่เห็นแป้นพิมพ์ฮาร์ดแวร์หรือเมื่ออุปกรณ์ไม่มีแป้นพิมพ์ฮาร์ดแวร์ก็ตาม หากไม่มีแป้นพิมพ์ซอฟต์แวร์หรือปิดใช้ไว้ ระบบจะใช้แป้นพิมพ์นี้เฉพาะเมื่อมีการแสดงแป้นพิมพ์ฮาร์ดแวร์
  • keyshidden: อุปกรณ์มีแป้นพิมพ์ฮาร์ดแวร์พร้อมใช้งาน แต่ซ่อนอยู่และอุปกรณ์ไม่ได้เปิดใช้แป้นพิมพ์เสมือน
  • keyssoft: อุปกรณ์เปิดใช้แป้นพิมพ์เสมือน ไม่ว่าจะ มองเห็นหรือไม่ก็ตาม

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

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

ดูฟิลด์การกำหนดค่า hardKeyboardHidden และ keyboardHidden ซึ่งระบุระดับการมองเห็นของคีย์บอร์ดฮาร์ดแวร์ และระดับการมองเห็นของคีย์บอร์ดทุกประเภท (รวมถึงซอฟต์แวร์) ตามลำดับ

วิธีการป้อนข้อความหลัก nokeys
qwerty
12key
  • nokeys: อุปกรณ์ไม่มีปุ่มฮาร์ดแวร์สำหรับการป้อนข้อความ
  • qwerty: อุปกรณ์มีแป้นพิมพ์ QWERTY แบบฮาร์ดแวร์ ไม่ว่าจะแสดงต่อ ผู้ใช้ หรือไม่ก็ตาม
  • 12key: อุปกรณ์มีแป้นพิมพ์ฮาร์ดแวร์แบบ 12 ปุ่มหรือไม่ และผู้ใช้มองเห็นแป้นพิมพ์หรือไม่

ดูkeyboardฟิลด์กำหนดค่า ซึ่งระบุวิธีการป้อนข้อมูลหลักที่ใช้ได้ด้วย

เวอร์ชันของแพลตฟอร์ม (ระดับ API) ตัวอย่าง
v3
v4
v7
ฯลฯ

ระดับ API ที่อุปกรณ์รองรับ เช่น v1 สำหรับ API ระดับ 1 (อุปกรณ์ที่ใช้ Android 1.0 ขึ้นไป) และ v4 สำหรับ API ระดับ 4 (อุปกรณ์ที่ใช้ Android 1.6 ขึ้นไป) ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าเหล่านี้ได้ในเอกสารระดับ API ของ Android

หมายเหตุ: 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 ค้นหา ทรัพยากรที่ตรงกันมากที่สุด

  1. นำไฟล์ทรัพยากรที่ขัดแย้งกับการกำหนดค่าอุปกรณ์ออก

    ระบบจะนำไดเรกทอรี drawable-fr-rCA/ ออกเนื่องจากขัดแย้งกับภาษา en-GB

    drawable/
    drawable-en/
    drawable-fr-rCA/
    drawable-en-night/
    drawable-en-notouch-12key/
    drawable-night-ldpi/
    drawable-night-notouch-12key/
    

    ข้อยกเว้น: ความหนาแน่นของพิกเซลหน้าจอเป็นคุณสมบัติเดียวที่ไม่ได้ ถูกนำออกเนื่องจากความขัดแย้ง แม้ว่าความหนาแน่นของหน้าจอของอุปกรณ์จะเป็น hdpi แต่ระบบก็ไม่ได้นำ drawable-night-ldpi/ ออกเนื่องจากถือว่าความหนาแน่นของหน้าจอทุกระดับตรงกันในตอนนี้ ดูข้อมูลได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ

  2. ค้นหาตัวระบุที่มีลำดับความสำคัญสูงสุดถัดไปในรายการ (ตารางที่ 2) (เริ่มต้นด้วย MCC)
  3. ไดเรกทอรีทรัพยากรมีตัวระบุนี้ไหม
    • หากไม่มี ให้กลับไปที่ขั้นตอนที่ 2 แล้วดูผู้มีสิทธิ์รายถัดไป ในตัวอย่างนี้ คำตอบคือ "ไม่" จนกว่าจะถึงตัวระบุภาษา
    • หากใช่ ให้ไปที่ขั้นตอนที่ 4
  4. นำไดเรกทอรีทรัพยากรที่ไม่มีตัวระบุนี้ออก ในตัวอย่างนี้ ระบบ จะนำไดเรกทอรีทั้งหมดที่ไม่มีตัวระบุภาษาออก
    drawable/
    drawable-en/
    drawable-en-night/
    drawable-en-notouch-12key/
    drawable-night-ldpi/
    drawable-night-notouch-12key/
    

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

  5. ทำขั้นตอนที่ 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 จึงถูกตัดออก

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากรของแอปได้ที่แหล่งข้อมูลเพิ่มเติมต่อไปนี้

เอกสารประกอบ

ดูเนื้อหา