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

แนวคิดและการติดตั้งใช้งาน Jetpack Compose

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

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

เมื่อแยกทรัพยากรของแอปออกไปภายนอกแล้ว คุณจะเข้าถึงทรัพยากรเหล่านั้นได้โดยใช้รหัสทรัพยากร ที่สร้างขึ้นในคลาส R ของโปรเจ็กต์ เอกสารนี้แสดงวิธีจัดกลุ่มทรัพยากรในโปรเจ็กต์ Android นอกจากนี้ ยังแสดงวิธีระบุ ทรัพยากรทางเลือกสำหรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจง แล้วเข้าถึงทรัพยากรเหล่านั้น จากโค้ดแอปหรือไฟล์ XML อื่นๆ

ประเภททรัพยากรของกลุ่ม

วางทรัพยากรแต่ละประเภทไว้ในไดเรกทอรีย่อยที่เฉพาะเจาะจงของไดเรกทอรี res/ ของโปรเจ็กต์ ตัวอย่างเช่น นี่คือลำดับชั้นของไฟล์สำหรับโปรเจ็กต์ง่ายๆ

MyProject/
    src/
        MyActivity.java
    res/
        drawable/
            graphic.png
        layout/
            main.xml
            info.xml
        mipmap/
            icon.png
        values/
            strings.xml

ไดเรกทอรี res/ มีทรัพยากรทั้งหมดในไดเรกทอรีย่อย ได้แก่ ทรัพยากรรูปภาพ ทรัพยากรเลย์เอาต์ 2 รายการ ไดเรกทอรี mipmap/ สำหรับไอคอนตัวเรียกใช้ และไฟล์ทรัพยากรสตริง ชื่อไดเรกทอรีทรัพยากรมีความสำคัญและ อธิบายไว้ในตารางที่ 1

ตาราง 1. ไดเรกทอรีทรัพยากรที่รองรับภายในไดเรกทอรีโปรเจ็กต์ res/

ไดเรกทอรี

ประเภทแหล่งข้อมูล

animator/

ไฟล์ XML ที่กำหนดภาพเคลื่อนไหวของพร็อพเพอร์ตี้

anim/

ไฟล์ XML ที่กำหนดภาพเคลื่อนไหวแบบทวีต นอกจากนี้ คุณยังบันทึกภาพเคลื่อนไหวของพร็อพเพอร์ตี้ในไดเรกทอรีนี้ได้ด้วย แต่ขอแนะนำให้ใช้ไดเรกทอรี animator/ สำหรับภาพเคลื่อนไหวของพร็อพเพอร์ตี้เพื่อแยกความแตกต่างระหว่างภาพเคลื่อนไหว 2 ประเภท

color/

ไฟล์ XML ที่กำหนดรายการสถานะของสี ดูข้อมูลเพิ่มเติมได้ที่แหล่งข้อมูลรายการสถานะสี

drawable/

ไฟล์บิตแมป (PNG, .9.png, JPG หรือ GIF) หรือไฟล์ XML ที่คอมไพล์เป็นทรัพยากรที่ถอนออกได้ต่อไปนี้

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

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

mipmap/

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

layout/

ไฟล์ XML ที่กำหนดเลย์เอาต์ของอินเทอร์เฟซผู้ใช้ ดูข้อมูลเพิ่มเติมได้ที่ทรัพยากรเลย์เอาต์

menu/

ไฟล์ XML ที่กำหนดเมนูแอป เช่น เมนูตัวเลือก เมนูตามบริบท หรือเมนูย่อย ดูข้อมูลเพิ่มเติมได้ที่ทรัพยากรเมนู

raw/

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

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

values/

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

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

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

ดูข้อมูลเพิ่มเติมได้ที่ทรัพยากรสตริง ทรัพยากรสไตล์ และประเภททรัพยากรอื่นๆ

xml/

ไฟล์ XML ที่กำหนดเองซึ่งอ่านได้ขณะรันไทม์โดยการเรียกใช้ Resources.getXML() ต้องบันทึกไฟล์การกำหนดค่า XML ต่างๆ ไว้ที่นี่

font/

ไฟล์แบบอักษรที่มีนามสกุล เช่น TTF, OTF หรือ TTC หรือไฟล์ XML ที่มีองค์ประกอบ ดูข้อมูลเพิ่มเติมเกี่ยวกับแบบอักษรเป็นทรัพยากรได้ที่เพิ่มแบบอักษรเป็นทรัพยากร XML

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

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

จัดหาแหล่งข้อมูลทางเลือก

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

รูปที่ 1 อุปกรณ์ 2 เครื่องที่ใช้ทรัพยากรเลย์เอาต์ที่แตกต่างกันตามขนาดหน้าจอ

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

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

ตารางที่ 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-2{:.external} โดยอาจตามด้วยรหัสภูมิภาคแบบ 2 ตัวอักษรตามมาตรฐาน ISO 3166-1-alpha-2{:.external} (นำหน้าด้วย r ตัวพิมพ์เล็ก)

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

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

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

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

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

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

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

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

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

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

ดูการผันไวยากรณ์ใน Android

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

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

ทิศทางเลย์เอาต์

ldrtl

ldltr

ทิศทางการจัดวางของแอป ldrtl หมายถึง "layout-direction-right-to-left" ldltr หมายถึง "layout-direction-left-to-right" และเป็นค่าเริ่มต้นโดยนัย

ซึ่งใช้ได้กับทรัพยากรทุกอย่าง เช่น เลย์เอาต์ Drawable หรือค่า

ตัวอย่างเช่น หากต้องการระบุเลย์เอาต์สำหรับภาษาอาหรับและเลย์เอาต์ทั่วไปสำหรับภาษาอื่นๆ ที่ "อ่านจากขวาไปซ้าย" เช่น เปอร์เซียหรือฮีบรู คุณจะต้องใช้ไดเรกทอรีดังต่อไปนี้

res/
layout/
main.xml
(เลย์เอาต์เริ่มต้น)
layout-ar/
main.xml (เลย์เอาต์เฉพาะสำหรับภาษาอาหรับ)
layout-ldrtl/
main.xml (ภาษาที่เขียนจากขวาไปซ้ายทั้งหมด ยกเว้นภาษาอาหรับ เนื่องจากตัวระบุภาษา "ar" มีลำดับความสำคัญสูงกว่า)

หมายเหตุ: หากต้องการเปิดใช้ฟีเจอร์เลย์เอาต์จากขวาไปซ้ายสำหรับแอป คุณต้องตั้งค่า SupportsRtl เป็น "true" และตั้งค่า TargetSdkVersion เป็น 17 ขึ้นไป

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

ความกว้างที่เล็กที่สุด

swdp

ตัวอย่าง

sw320dp

sw600dp

sw720dp

อื่นๆ

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

เช่น หากเลย์เอาต์กำหนดให้ขนาดที่เล็กที่สุดของพื้นที่หน้าจอต้องมีอย่างน้อย 600 dp ตลอดเวลา คุณก็ใช้ตัวระบุนี้เพื่อสร้างทรัพยากรเลย์เอาต์ในไดเรกทอรี res/layout-sw600dp/ ได้ ระบบจะใช้ทรัพยากรเหล่านี้เฉพาะเมื่อมิติข้อมูลที่เล็กที่สุดของหน้าจอที่ใช้ได้มีขนาดอย่างน้อย 600 dp ไม่ว่าด้าน 600 dp จะเป็นความสูงหรือความกว้างที่ผู้ใช้รับรู้หรือไม่ก็ตาม ความกว้างที่เล็กที่สุดอาจเปลี่ยนแปลงได้หากมีการปรับขนาดหน้าต่าง เปลี่ยนความกว้าง/ความสูงที่ใช้ได้ หรือเปลี่ยนตำแหน่ง ซึ่งอาจเปลี่ยนระยะขอบของระบบ

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

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

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

ค่าบางอย่างที่คุณอาจใช้ที่นี่สำหรับขนาดหน้าจอทั่วไปมีดังนี้

  • 320 สำหรับอุปกรณ์ที่มีการกำหนดค่าหน้าจอ เช่น
    • 240x320 ldpi (โทรศัพท์ QVGA)
    • 320x480 mdpi (โทรศัพท์มือถือ)
    • 480x800 hdpi (โทรศัพท์มือถือที่มีความหนาแน่นสูง)
  • 480 สำหรับหน้าจอ เช่น 480x800 mdpi (แท็บเล็ต/โทรศัพท์มือถือ)
  • 600 สำหรับหน้าจอ เช่น 600x1024 mdpi (แท็บเล็ต 7 นิ้ว)
  • 720 สำหรับหน้าจอ เช่น 720x1280 mdpi (แท็บเล็ต 10 นิ้ว)

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

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

ดูแอตทริบิวต์ android:requiresSmallestWidthDp ซึ่งประกาศ smallestWidth ขั้นต่ำที่แอปของคุณเข้ากันได้ และฟิลด์การกำหนดค่า smallestScreenWidthDp ซึ่งมีค่า smallestWidth ของอุปกรณ์

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

ความกว้างและความสูงที่ใช้ได้

wdp

hdp

ตัวอย่าง

w720dp

w1024dp

h720dp

h1024dp

อื่นๆ

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

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

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

ค่าดังกล่าวไม่รวมพื้นที่ที่ขอบหน้าต่างครอบครอง ดังนั้นหากอุปกรณ์มีองค์ประกอบ UI แบบถาวรที่ขอบของจอแสดงผล ค่าความกว้างและความสูงจะเล็กกว่าขนาดหน้าจอจริง แม้ว่าแอปจะแสดงแบบขอบจรดขอบโดยใช้ Window.setDecorFitsSystemWindows หรือ WindowCompat.setDecorFitsSystemWindows ก็ตาม

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

หมายเหตุ: ระบบจะเลือกแหล่งข้อมูลที่มีความกว้างและความสูงตรงกัน ดังนั้น เราจึงขอแนะนำให้ใช้ทรัพยากรที่ระบุทั้ง 2 อย่างมากกว่าทรัพยากรที่ระบุอย่างใดอย่างหนึ่งเท่านั้น ตัวอย่างเช่น หากหน้าจอจริงมีความกว้าง 720dp และสูง 1280dp และทรัพยากรหนึ่งมีคุณสมบัติเป็น w720dp และอีกทรัพยากรมีคุณสมบัติเป็น w700dp-h1200dp ระบบจะเลือกทรัพยากรหลังแม้ว่าทรัพยากรแรกจะตรงกับสิ่งที่ระบุไว้ก็ตาม

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

ดูฟิลด์การกำหนดค่า screenWidthDp และ screenHeightDp ซึ่งเก็บความกว้างและความสูงของหน้าจอปัจจุบันด้วย

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

ขนาดหน้าจอ

small

normal

large

xlarge

  • small: หน้าจอที่มีขนาดคล้ายกับหน้าจอ QVGA ความหนาแน่นต่ำ ขนาดเลย์เอาต์ขั้นต่ำสำหรับหน้าจอขนาดเล็กคือประมาณ 320x426 หน่วย dp เช่น QVGA ความหนาแน่นต่ำและ VGA ความหนาแน่นสูง
  • normal: หน้าจอที่มีขนาดคล้ายกับหน้าจอ HVGA ความหนาแน่นปานกลาง ขนาดเลย์เอาต์ขั้นต่ำสำหรับหน้าจอปกติคือประมาณ 320x470 หน่วย dp ตัวอย่างหน้าจอดังกล่าว ได้แก่ WQVGA ความหนาแน่นต่ำ, HVGA ความหนาแน่นปานกลาง และ WVGA ความหนาแน่นสูง
  • large: หน้าจอที่มีขนาดใกล้เคียงกับหน้าจอ VGA ความหนาแน่นปานกลาง ขนาดเลย์เอาต์ขั้นต่ำสำหรับหน้าจอขนาดใหญ่คือประมาณ 480x640 หน่วย dp ตัวอย่างเช่น หน้าจอความหนาแน่นปานกลาง VGA และ WVGA
  • xlarge: หน้าจอที่มีขนาดใหญ่กว่าหน้าจอ HVGA แบบความหนาแน่นปานกลางแบบดั้งเดิมอย่างมาก ขนาดเลย์เอาต์ขั้นต่ำสำหรับหน้าจอ xlarge คือประมาณ 720x960 หน่วย dp ในกรณีส่วนใหญ่ อุปกรณ์ที่มีหน้าจอขนาดใหญ่พิเศษจะมีขนาดใหญ่เกินกว่าจะพกพาในกระเป๋า และส่วนใหญ่จะเป็นอุปกรณ์สไตล์แท็บเล็ต เพิ่มใน API ระดับ 9

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

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

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

ดูฟิลด์การกำหนดค่า screenLayout ด้วย ซึ่งจะระบุว่าหน้าจอมีขนาดเล็ก ปกติ หรือใหญ่

ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ

สัดส่วนหน้าจอ

long

notlong

  • long: หน้าจอยาว เช่น WQVGA, WVGA, FWVGA
  • notlong: ไม่ใช่หน้าจอยาว เช่น QVGA, HVGA และ VGA

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

ซึ่งอิงตามสัดส่วนภาพของหน้าจอเท่านั้น (หน้าจอ long จะกว้างกว่า) ซึ่งไม่เกี่ยวข้องกับการวางแนวหน้าจอ

ดูฟิลด์กำหนดค่า screenLayout ด้วย ซึ่งจะระบุว่าหน้าจอยาวหรือไม่

หน้าจอกลม

round

notround

  • round: หน้าจอกลม เช่น อุปกรณ์ที่สวมใส่ได้ทรงกลม
  • notround: หน้าจอรูปสี่เหลี่ยมผืนผ้า เช่น โทรศัพท์หรือแท็บเล็ต

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

ดูวิธีการกำหนดค่า isScreenRound ซึ่งจะระบุว่าหน้าจอเป็นทรงกลมหรือไม่

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 หรือไม่

การวางแนวหน้าจอ

port

land

  • port: อุปกรณ์อยู่ในแนวตั้ง (แนวตั้ง)
  • land: อุปกรณ์อยู่ในแนวนอน

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

นอกจากนี้ โปรดดูฟิลด์กำหนดค่า orientation ซึ่งระบุการวางแนวอุปกรณ์ปัจจุบัน

โหมด UI

car

desk

television

appliance

watch

vrheadset

  • car: อุปกรณ์แสดงในแท่นชาร์จในรถ
  • desk: อุปกรณ์แสดงในแท่นวางบนโต๊ะ
  • television: อุปกรณ์แสดงผลบนโทรทัศน์ ซึ่งมอบประสบการณ์การใช้งาน "10 ฟุต" ที่ 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 ซึ่งระบุวิธีการป้อนข้อความหลักที่ใช้ได้ด้วย

ความพร้อมใช้งานของปุ่มนำทาง

navexposed

navhidden

  • navexposed: ผู้ใช้จะใช้ปุ่มนำทางได้
  • navhidden: ไม่มีปุ่มนำทาง (เช่น อยู่หลังฝาปิด)

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

นอกจากนี้ โปรดดูฟิลด์กำหนดค่า navigationHidden ซึ่งระบุว่าซ่อนปุ่มนำทางหรือไม่

วิธีการนำทางหลักแบบไม่สัมผัส

nonav

dpad

trackball

wheel

  • nonav: อุปกรณ์ไม่มีฟีเจอร์การนำทางนอกเหนือจากการใช้หน้าจอสัมผัส
  • dpad: อุปกรณ์มีปุ่มบังคับทิศทาง (D-pad) สำหรับการนำทาง
  • trackball: อุปกรณ์มีแทร็กบอลสำหรับการนำทาง
  • wheel: อุปกรณ์มีล้อบังคับทิศทางสำหรับการนำทาง (พบได้ไม่บ่อย)

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

เวอร์ชันของแพลตฟอร์ม (ระดับ API)

ตัวอย่าง

v3

v4

v7

อื่นๆ

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

กฎชื่อตัวระบุ

กฎบางอย่างเกี่ยวกับการใช้ชื่อตัวระบุการกำหนดค่ามีดังนี้

  • คุณระบุตัวระบุหลายรายการสำหรับชุดทรัพยากรเดียวได้โดยคั่นด้วยขีดกลาง เช่น drawable-en-rUS-land จะมีผลกับอุปกรณ์ที่ใช้ภาษาอังกฤษ (สหรัฐอเมริกา) ในแนวนอน
  • ตัวระบุต้องอยู่ในลำดับที่ระบุไว้ในตารางที่ 2
    • ไม่ถูกต้อง: drawable-hdpi-port/
    • ถูกต้อง: drawable-port-hdpi/
  • คุณจะซ้อนไดเรกทอรีทรัพยากรทางเลือกไม่ได้ ตัวอย่างเช่น คุณไม่สามารถ มี res/drawable/drawable-en/ ได้
  • การป้อนค่านั้นไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คอมไพเลอร์ทรัพยากรจะแปลงชื่อไดเรกทอรี เป็นตัวพิมพ์เล็กก่อนประมวลผลเพื่อหลีกเลี่ยงปัญหาในระบบไฟล์ ที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ การใช้อักษรตัวพิมพ์ใหญ่ในชื่อมีไว้เพื่อให้อ่านง่ายขึ้นเท่านั้น
  • ระบบรองรับค่าเดียวสำหรับตัวระบุประเภทแต่ละรายการ เช่น หากต้องการใช้ไฟล์ Drawable เดียวกันสำหรับสเปนและฝรั่งเศส คุณจะมีไดเรกทอรีชื่อ drawable-es-fr/ ไม่ได้ แต่คุณต้องมีไดเรกทอรีทรัพยากร 2 รายการ เช่น drawable-es/ และ drawable-fr/ ซึ่งมีไฟล์ที่เหมาะสม อย่างไรก็ตาม คุณไม่จำเป็นต้องทำซ้ำไฟล์ในทั้ง 2 ตำแหน่ง แต่คุณสามารถสร้างชื่อแทนให้กับทรัพยากรได้ ตามที่อธิบายไว้ในส่วนสร้างทรัพยากรชื่อแทน

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

หากไม่มีทรัพยากรอื่นที่ตรงกับการกำหนดค่าอุปกรณ์หนึ่งๆ Android จะใช้ทรัพยากรเริ่มต้นที่เกี่ยวข้อง ซึ่งเป็นชุด ทรัพยากรสำหรับประเภททรัพยากรหนึ่งๆ ที่ไม่มีตัวระบุการกำหนดค่า

สร้างทรัพยากรชื่อแทน

เมื่อมีทรัพยากรที่ต้องการใช้สําหรับการกําหนดค่าอุปกรณ์มากกว่า 1 รายการ แต่ไม่ต้องการระบุเป็นทรัพยากรเริ่มต้น คุณไม่จําเป็นต้องใส่ทรัพยากรเดียวกันในไดเรกทอรีทรัพยากรทางเลือกมากกว่า 1 รายการ แต่คุณสามารถสร้างทรัพยากรทางเลือกที่ทำหน้าที่เป็นนามแฝงสำหรับทรัพยากรที่บันทึกไว้ในไดเรกทอรีทรัพยากรเริ่มต้นได้

ตัวอย่างเช่น สมมติว่าคุณมีไอคอนแอป icon.png และต้องการเวอร์ชันที่ไม่ซ้ำกัน สำหรับภาษาต่างๆ อย่างไรก็ตาม ภาษาอังกฤษ (แคนาดา) และภาษาฝรั่งเศส (แคนาดา) ต้องใช้เวอร์ชันเดียวกัน คุณไม่จำเป็นต้องคัดลอกรูปภาพเดียวกันลงในไดเรกทอรีทรัพยากรสำหรับทั้งภาษาอังกฤษ-แคนาดาและฝรั่งเศส-แคนาดา แต่คุณสามารถบันทึกรูปภาพที่ใช้สำหรับทั้ง 2 อย่างโดยใช้ชื่ออื่น icon.png เช่น icon_ca.png แล้ววางไว้ในไดเรกทอรี res/drawable/ เริ่มต้น จากนั้นสร้างไฟล์ icon.xml ใน res/drawable-en-rCA/ และ res/drawable-fr-rCA/ ที่อ้างอิงถึงทรัพยากร icon_ca.png โดยใช้ องค์ประกอบ <bitmap> ซึ่งจะช่วยให้คุณจัดเก็บไฟล์ PNG เพียงเวอร์ชันเดียวและไฟล์ XML ขนาดเล็ก 2 ไฟล์ที่ชี้ไปยังไฟล์ดังกล่าว ดูรายละเอียดได้ในตัวอย่างในส่วนต่อไปนี้

ถอนออกได้

หากต้องการสร้างชื่อแทนสำหรับ Drawable ที่มีอยู่ ให้ใช้องค์ประกอบ <drawable> ดังนี้

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <drawable name="icon">@drawable/icon_ca</drawable>
</resources>

หากบันทึกไฟล์นี้เป็น icon.xml ในไดเรกทอรีทรัพยากรทางเลือก เช่น res/values-en-rCA/ ระบบจะคอมไพล์ไฟล์นี้เป็นทรัพยากรที่คุณอ้างอิงได้เป็น R.drawable.icon แต่จริงๆ แล้วเป็นนามแฝงของทรัพยากร R.drawable.icon_ca ซึ่งบันทึกไว้ใน res/drawable/

การจัดวาง

หากต้องการสร้างชื่อแทนให้กับเลย์เอาต์ที่มีอยู่ ให้ใช้องค์ประกอบ <include> ที่อยู่ใน <merge> ดังนี้

<?xml version="1.0" encoding="utf-8"?>
<merge>
  <include layout="@layout/main_ltr"/>
</merge>

หากบันทึกไฟล์นี้เป็น main.xml ระบบจะคอมไพล์เป็นทรัพยากรที่คุณอ้างอิงเป็น R.layout.main ได้ แต่จริงๆ แล้วเป็นนามแฝงสำหรับทรัพยากร R.layout.main_ltr

เข้าถึงทรัพยากรของแอป

เมื่อระบุทรัพยากรในแอปพลิเคชันแล้ว คุณจะใช้ทรัพยากรนั้นได้โดยอ้างอิง รหัสทรัพยากรของทรัพยากรนั้น รหัสทรัพยากรทั้งหมดจะกำหนดไว้ในคลาส R ของโปรเจ็กต์ ซึ่งเครื่องมือ aapt จะสร้างขึ้นโดยอัตโนมัติ

เมื่อคอมไพล์แอปพลิเคชัน aapt จะสร้างคลาส R ซึ่งมีรหัสทรัพยากรสำหรับทรัพยากรทั้งหมดในไดเรกทอรี res/ สำหรับทรัพยากรแต่ละประเภทจะมีRคลาสย่อย เช่น R.drawable สำหรับทรัพยากรที่วาดได้ทั้งหมด และสำหรับทรัพยากรแต่ละรายการของประเภทนั้น จะมีจำนวนเต็มแบบคงที่ เช่น R.drawable.icon จำนวนเต็มนี้คือรหัสทรัพยากรที่คุณใช้เพื่อดึงข้อมูลทรัพยากรได้

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

  • ประเภททรัพยากร: ระบบจะจัดกลุ่มทรัพยากรแต่ละรายการเป็น "ประเภท" เช่น string, drawable และ layout ดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทต่างๆ ได้ที่ภาพรวมประเภททรัพยากร
  • ชื่อทรัพยากร ซึ่งอาจเป็นชื่อไฟล์ที่ไม่รวมนามสกุลหรือ ค่าในแอตทริบิวต์ android:name ของ XML หากทรัพยากรเป็นค่าอย่างง่าย เช่น สตริง

คุณเข้าถึงทรัพยากรได้ 2 วิธีดังนี้

  • ในโค้ด: ใช้จำนวนเต็มแบบคงที่จากคลาสย่อยของคลาส R เช่น R.string.hello string คือประเภททรัพยากร และ hello คือชื่อทรัพยากร มี Android API หลายรายการที่เข้าถึงทรัพยากรได้เมื่อคุณระบุรหัสทรัพยากรในรูปแบบนี้ ดูข้อมูลเพิ่มเติมได้ที่ส่วนเข้าถึงทรัพยากรในโค้ด
  • ใน XML: ใช้ไวยากรณ์ XML พิเศษที่สอดคล้องกับรหัสทรัพยากร ที่กำหนดไว้ในคลาส R เช่น @string/hello string คือประเภททรัพยากร และ hello คือชื่อทรัพยากร คุณสามารถใช้ไวยากรณ์นี้ในทรัพยากร XML ได้ทุกที่ที่คาดว่าจะต้องระบุค่าในทรัพยากร ดูข้อมูลเพิ่มเติมได้ที่ส่วนเข้าถึงทรัพยากรจาก XML

เข้าถึงทรัพยากรในโค้ด

คุณใช้ทรัพยากรในโค้ดได้โดยส่งรหัสทรัพยากรเป็นพารามิเตอร์ของเมธอด เช่น คุณสามารถตั้งค่า ImageView เพื่อใช้ res/drawable/myimage.png โดยใช้ setImageResource ได้ดังนี้

Kotlin

val imageView = findViewById(R.id.myimageview) as ImageView
imageView.setImageResource(R.drawable.myimage)

Java

ImageView imageView = (ImageView) findViewById(R.id.myimageview);

imageView.setImageResource(R.drawable.myimage);

นอกจากนี้ คุณยังเรียกข้อมูลทรัพยากรแต่ละรายการได้โดยใช้วิธีการใน Resources ซึ่งคุณจะรับอินสแตนซ์ได้ด้วย getResources

ไวยากรณ์

ไวยากรณ์ในการอ้างอิงทรัพยากรในโค้ดมีดังนี้

[<package_name>.]R.<resource_type>.<resource_name>

  • <package_name> คือชื่อของแพ็กเกจที่มีทรัพยากร อยู่ (ไม่จำเป็นต้องระบุเมื่ออ้างอิงทรัพยากรจากแพ็กเกจของคุณเอง)
  • <resource_type> คือคลาสย่อย R สำหรับประเภททรัพยากร
  • <resource_name> คือชื่อไฟล์ทรัพยากรที่ไม่มีนามสกุลหรือค่าแอตทริบิวต์ android:name ในองค์ประกอบ XML สำหรับค่าที่เรียบง่าย

กรณีการใช้งาน

มีหลายวิธีที่ยอมรับพารามิเตอร์รหัสทรัพยากร และคุณสามารถเรียกข้อมูล ทรัพยากรได้โดยใช้วิธีการใน Resources คุณรับอินสแตนซ์ของ Resources ได้โดยใช้ Context.getResources

ตัวอย่างการเข้าถึงทรัพยากรในโค้ดมีดังนี้

Kotlin

// Load a background for the current screen from a drawable resource.
window.setBackgroundDrawableResource(R.drawable.my_background_image)

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID.
window.setTitle(resources.getText(R.string.main_title))

// Load a custom layout for the current screen.
setContentView(R.layout.main_screen)

// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in))

// Set the text on a TextView object using a resource ID.
val msgTextView = findViewById(R.id.msg) as TextView
msgTextView.setText(R.string.hello_message)

Java

// Load a background for the current screen from a drawable resource.
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID.
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen.
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID.
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

เข้าถึงทรัพยากรจาก XML

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

ตัวอย่างเช่น หากเพิ่ม Button ลงในเลย์เอาต์ ให้ใช้ทรัพยากร สตริงสำหรับข้อความปุ่ม

<Button
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/submit" />

ไวยากรณ์

ต่อไปนี้คือไวยากรณ์ในการอ้างอิงทรัพยากรในทรัพยากร XML

@[<package_name>:]<resource_type>/<resource_name>

  • <package_name> คือชื่อของแพ็กเกจที่มีทรัพยากรอยู่ (ไม่จำเป็นเมื่ออ้างอิงทรัพยากรจากแพ็กเกจเดียวกัน)
  • <resource_type> คือคลาสย่อย R สำหรับประเภททรัพยากร
  • <resource_name> คือชื่อไฟล์ทรัพยากรที่ไม่มีนามสกุลหรือค่าแอตทริบิวต์ android:name ในองค์ประกอบ XML สำหรับค่าที่เรียบง่าย

กรณีการใช้งาน

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="opaque_red">#f00</color>
  <string name="hello">Hello!</string>
</resources>

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

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:textColor="@color/opaque_red"
  android:text="@string/hello" />

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

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:textColor="@android:color/secondary_text_dark"
  android:text="@string/hello" />

คุณยังใช้ทรัพยากรใน XML เพื่อสร้างชื่อแทนได้ด้วย ตัวอย่างเช่น คุณสามารถสร้าง ทรัพยากรที่วาดได้ซึ่งเป็นชื่อแทนของทรัพยากรที่วาดได้อีกรายการหนึ่ง ดังนี้

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
  android:src="@drawable/other_drawable" />

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

แอตทริบิวต์รูปแบบการอ้างอิง

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

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

?[<package_name>:][<resource_type>/]<resource_name>

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

<EditText id="text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:textColor="?android:textColorSecondary"
  android:text="@string/hello_world" />

ในที่นี้ แอตทริบิวต์ android:textColor ระบุชื่อของแอตทริบิวต์สไตล์ ในธีมปัจจุบัน ตอนนี้ Android ใช้ค่าที่ใช้กับแอตทริบิวต์รูปแบบ android:textColorSecondary เป็นค่าสำหรับ android:textColor ในวิดเจ็ตนี้ เนื่องจากเครื่องมือทรัพยากรของระบบทราบว่า ควรมีทรัพยากรแอตทริบิวต์ในบริบทนี้ คุณจึงไม่จำเป็นต้องระบุ ประเภทอย่างชัดเจน ซึ่งก็คือ ?android:attr/textColorSecondary คุณยกเว้นประเภท attr ได้

เข้าถึงไฟล์ต้นฉบับ

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

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

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

เข้าถึงแหล่งข้อมูลของแพลตฟอร์ม

Android มีทรัพยากรมาตรฐานหลายอย่าง เช่น สไตล์ ธีม และเลย์เอาต์ หากต้องการเข้าถึงทรัพยากรเหล่านี้ ให้ระบุการอ้างอิงทรัพยากรด้วยandroidชื่อแพ็กเกจ เช่น Android มีทรัพยากรเลย์เอาต์ที่คุณใช้กับรายการใน ListAdapter ได้

Kotlin

listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)

Java

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

ในตัวอย่างนี้ simple_list_item_1 คือทรัพยากรเลย์เอาต์ที่แพลตฟอร์มกำหนดไว้สำหรับรายการใน ListView คุณสามารถใช้เลย์เอาต์นี้แทนการสร้างเลย์เอาต์ของคุณเองสำหรับรายการในลิสต์ได้

มอบความเข้ากันได้ของอุปกรณ์ที่ดีที่สุดด้วยทรัพยากร

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

เช่น หากแอปของคุณรองรับหลายภาษา ให้ใส่values/ ไดเรกทอรี (ที่บันทึกสตริง) โดยไม่มีตัวระบุภาษาและภูมิภาคเสมอ แต่หากคุณใส่ไฟล์สตริงทั้งหมดไว้ในไดเรกทอรีที่มีตัวระบุภาษาและภูมิภาค แอปจะขัดข้องเมื่อเรียกใช้ในอุปกรณ์ที่ตั้งค่าเป็นภาษาที่สตริงไม่รองรับ

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

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

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

เช่น หากตั้งค่า minSdkVersion เป็น 4 และคุณมีทรัพยากรที่วาดได้ทั้งหมดที่ใช้โหมดกลางคืน (night หรือ notnight ซึ่งเพิ่มเข้ามาในระดับ API 8) อุปกรณ์ระดับ API 4 จะเข้าถึงทรัพยากรที่วาดได้ไม่ได้และจะเกิดข้อขัดข้อง ในกรณีนี้ คุณอาจต้องการให้ notnight เป็น ทรัพยากรเริ่มต้น ดังนั้นให้ยกเว้นตัวระบุนั้นและใส่ทรัพยากร Drawable ไว้ใน drawable/ หรือ drawable-night/

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

ข้อยกเว้นของกฎนี้คือ หาก minSdkVersion ของแอปมีค่าตั้งแต่ 4 ขึ้นไป คุณไม่จำเป็นต้องมีทรัพยากร Drawable เริ่มต้นเมื่อระบุทรัพยากร Drawable สำรองที่มีตัวระบุความหนาแน่นของหน้าจอ แม้จะไม่มีทรัพยากร Drawable เริ่มต้น Android ก็สามารถค้นหาความหนาแน่นของหน้าจอทางเลือกที่ตรงกันมากที่สุดและปรับขนาดบิตแมปได้ตามต้องการ อย่างไรก็ตาม เพื่อให้ได้รับประสบการณ์การใช้งานที่ดีที่สุดในอุปกรณ์ทุกประเภท ให้ระบุภาพวาดสำรองสำหรับความหนาแน่นทั้ง 3 ประเภท