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

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

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

หมายเหตุ: ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้โฟลเดอร์ mipmap ได้ที่ วางไอคอนแอปในไดเรกทอรี mipmap

ตารางที่ 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/

ไฟล์ใดก็ได้ที่จะบันทึกในรูปแบบดิบ หากต้องการเปิดแหล่งข้อมูลเหล่านี้ด้วย 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 ประเภทต่างๆ อาจต้องใช้ทรัพยากรประเภทต่างๆ

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

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

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

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

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

  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 (สตริงที่มีเพศกลาง)

ดูการผันไวยากรณ์ใน 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

ความกว้างที่เล็กที่สุด sw<N>dp

ตัวอย่าง
sw320dp
sw600dp
sw720dp
ฯลฯ

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

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

ความกว้างและความสูงที่ใช้ได้ w<N>dp
h<N>dp

ตัวอย่าง:
w720dp
w1024dp
h720dp
h1024dp
ฯลฯ

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

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

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

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

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

หมายเหตุ: ระบบจะเลือกแหล่งข้อมูลที่มีความกว้างและความสูงตรงกัน ดังนั้น เราจึงขอแนะนำให้ใช้แหล่งข้อมูลที่ระบุทั้ง 2 อย่างมากกว่าแหล่งข้อมูลที่ระบุอย่างใดอย่างหนึ่ง ตัวอย่างเช่น หากหน้าจอจริงมีความกว้าง 720 dp และสูง 1280 dp และทรัพยากรหนึ่งมีคุณสมบัติ 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: อุปกรณ์แสดงผลบนโทรทัศน์ ซึ่งมอบประสบการณ์การใช้งานในระยะไกล โดยมี UI อยู่บนหน้าจอขนาดใหญ่ที่ผู้ใช้อยู่ห่างออกไป และประสบการณ์การใช้งาน มุ่งเน้นไปที่ D-pad หรือการโต้ตอบอื่นๆ ที่ไม่ใช่การใช้เคอร์เซอร์เป็นหลัก
  • appliance: อุปกรณ์ทำหน้าที่เป็นเครื่องใช้ไฟฟ้าโดย ไม่มีจอแสดงผล
  • watch: อุปกรณ์มีจอแสดงผลและสวมใส่ที่ข้อมือ
  • vrheadset: อุปกรณ์แสดงในชุดหูฟัง Virtual Reality

เพิ่มใน API ระดับ 8, เพิ่มโทรทัศน์ใน API ระดับ 13 และเพิ่มนาฬิกาใน API ระดับ 20

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

ค่านี้อาจเปลี่ยนแปลงได้ตลอดอายุการใช้งานของแอปหากผู้ใช้วางอุปกรณ์ไว้ใน แท่นวาง คุณเปิดหรือปิดใช้โหมดบางโหมดได้โดยใช้ 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 บางเวอร์ชันไม่รองรับตัวระบุทั้งหมด การใช้ตัวระบุใหม่จะเพิ่มตัวระบุเวอร์ชันแพลตฟอร์มโดยนัย เพื่อให้รุ่นเก่าๆ สามารถละเว้นได้ เช่น การใช้ตัวระบุ w600dp จะรวมตัวระบุ v13 โดยอัตโนมัติ เนื่องจาก ตัวระบุความกว้างที่ใช้ได้เป็นของใหม่ใน API ระดับ 13 โปรดระบุชุดทรัพยากรเริ่มต้น (ชุดทรัพยากรที่ไม่มีตัวระบุ) เสมอเพื่อหลีกเลี่ยงปัญหา ดูข้อมูลเพิ่มเติมได้ที่ส่วนเกี่ยวกับการมอบความเข้ากันได้ของอุปกรณ์ที่ดีที่สุดด้วย แหล่งข้อมูล

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

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

  • คุณระบุตัวระบุได้หลายรายการสำหรับชุดทรัพยากรเดียว โดยคั่นด้วยขีดกลาง ตัวอย่างเช่น 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 ไดเรกทอรี แต่คุณสามารถสร้างทรัพยากร ทางเลือก ที่ทำหน้าที่เป็นนามแฝงสำหรับทรัพยากรที่บันทึกไว้ในไดเรกทอรีทรัพยากรเริ่มต้นได้

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

ตัวอย่างเช่น สมมติว่าคุณมีไอคอนแอป 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 ไฟล์ที่ชี้ไปยังไฟล์ PNG นั้น ดูรายละเอียดได้ในตัวอย่างในส่วนต่อไปนี้

ถอนออกได้

หากต้องการสร้างชื่อแทนให้กับ 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

สตริงและค่าอย่างง่ายอื่นๆ

หากต้องการสร้างชื่อแทนให้กับสตริงที่มีอยู่ ให้ใช้รหัสทรัพยากรของสตริงที่ต้องการเป็นค่าสำหรับสตริงใหม่

<?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 และ layout ดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทต่างๆ ได้ที่ภาพรวมประเภททรัพยากร
  • ชื่อทรัพยากร ซึ่งอาจเป็นชื่อไฟล์ ไม่รวมนามสกุล หรือค่าในแอตทริบิวต์ XML android:name หาก ทรัพยากรเป็นค่าอย่างง่าย เช่น สตริง

คุณเข้าถึงทรัพยากรได้ 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);

ข้อควรระวัง: อย่าแก้ไขไฟล์ R.java ด้วยตนเอง โดย aapt จะสร้างไฟล์นี้เมื่อคอมไพล์โปรเจ็กต์ ระบบจะลบล้างการเปลี่ยนแปลงในครั้งถัดไปที่คุณคอมไพล์

เข้าถึงทรัพยากรจาก 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 เพื่อสร้างชื่อแทนได้ด้วย เช่น คุณสร้าง ทรัพยากร Drawable ที่เป็นนามแฝงของทรัพยากร Drawable อื่นได้ดังนี้

<?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 style เป็นค่าสำหรับ 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/ แอปก็จะทำงานได้อย่างถูกต้อง แม้ว่าผู้ใช้จะไม่เข้าใจภาษาที่แอปแสดงก็ตาม ซึ่งดีกว่าการที่แอปขัดข้อง

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

การระบุทรัพยากรเริ่มต้นมีความสำคัญไม่เพียงเพราะแอปอาจทำงานในการกำหนดค่าที่คุณไม่ได้คาดการณ์ไว้ แต่ยังเป็นเพราะ 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-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

และสมมติว่าการกำหนดค่าอุปกรณ์เป็นดังนี้

Locale = en-GB
การวางแนวหน้าจอ = port
ความหนาแน่นของพิกเซลหน้าจอ = hdpi
ประเภทหน้าจอสัมผัส = notouch
วิธีการป้อนข้อความหลัก = 12key

Android จะเลือก Drawable จาก drawable-en-port โดยเปรียบเทียบการกำหนดค่าอุปกรณ์กับทรัพยากรทางเลือกที่มี

ระบบจะตัดสินใจว่าจะใช้ทรัพยากรใดโดยใช้ตรรกะต่อไปนี้

รูปที่ 2 โฟลว์ชาร์ตแสดงวิธีที่ Android ค้นหา ทรัพยากรที่ตรงกันมากที่สุด

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

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

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

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

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

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

  5. ทำขั้นตอนที่ 2, 3 และ 4 ซ้ำจนกว่าจะเหลือไดเรกทอรีเพียง 1 รายการ ในตัวอย่างนี้ screen orientation คือตัวระบุถัดไปที่มีรายการที่ตรงกัน ดังนั้น ระบบจะนำทรัพยากรที่ไม่ได้ระบุการวางแนวหน้าจอออก
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    

    ไดเรกทอรีที่เหลือคือ drawable-en-port

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

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

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

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