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

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

ภายนอกทรัพยากรของแอป เช่น รูปภาพและสตริง จาก เพื่อให้คุณดูแลรักษาแยกต่างหากได้ รวมทั้งให้แหล่งข้อมูลอื่นสำหรับ การกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจงโดยจัดกลุ่มไว้ในไดเรกทอรีทรัพยากรที่มีชื่อพิเศษ ที่ 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 ที่ระบุ Tween ภาพเคลื่อนไหว ภาพเคลื่อนไหวของคุณสมบัติยังสามารถบันทึกได้ในไดเรกทอรีนี้ แต่ ควรใช้ไดเรกทอรี animator/ สำหรับภาพเคลื่อนไหวของพร็อพเพอร์ตี้เพื่อแยกความแตกต่างระหว่างไดเรกทอรี ประเภทต่างๆ
color/ ไฟล์ XML ที่กำหนดรายการสถานะสี สำหรับข้อมูลเพิ่มเติม โปรดดูที่สี ทรัพยากรรายการสถานะ
drawable/

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

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

ดูข้อมูลเพิ่มเติมได้ที่แหล่งข้อมูลที่ถอนออกได้

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

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

ระบุแหล่งข้อมูลอื่น

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

ข้อควรระวัง: เมื่อกำหนดทรัพยากรอื่น โปรดตรวจสอบว่า กำหนดทรัพยากรในการกำหนดค่าเริ่มต้นด้วย ไม่เช่นนั้น แอปอาจเจอรันไทม์ เมื่ออุปกรณ์เปลี่ยนการกำหนดค่า เช่น หากคุณเพิ่มสตริงให้กับ values-en ไม่ใช่ values แอปของคุณอาจพบปัญหา ข้อยกเว้น Resource Not Found รายการเมื่อผู้ใช้เปลี่ยนภาษาเริ่มต้นของระบบ

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

ตาราง 2 ตัวระบุการกําหนดค่า

การกำหนดค่า ค่าตัวระบุ คำอธิบาย
MCC และ MNC ตัวอย่าง:

mcc310 mcc310-mnc004
mcc208-mnc00

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

หากอุปกรณ์ใช้การเชื่อมต่อวิทยุ (เป็นโทรศัพท์ 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

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

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

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

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

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

สำหรับคู่มือฉบับเต็มในการแปลแอปของคุณเป็นภาษาอื่น โปรดดูการแปลแอปของคุณ

โปรดดูเมธอด getLocales() ซึ่งแสดงรายการที่กำหนดไว้ของ ภาษา รายการนี้ประกอบด้วยภาษาหลัก

ทิศทางของเลย์เอาต์ ldrtl
ldltr

ทิศทางเลย์เอาต์ของแอป ldrtl หมายถึง "รูปแบบทิศทางจากขวาไปซ้าย" ldltr หมายถึง "เลย์เอาต์ทิศทางจากซ้ายไปขวา" และเป็นค่าเริ่มต้นโดยนัย

ซึ่งจะมีผลกับทรัพยากรทั้งหมด เช่น เลย์เอาต์ ทรัพยากรที่ถอนออกได้ หรือค่า

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

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> dps สำหรับ UI

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

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

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

ความกว้างที่เล็กที่สุดของอุปกรณ์จะพิจารณาจากการตกแต่งหน้าจอและ 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 รายการใน ความกว้างและความสูง ดังนั้นทรัพยากรที่ระบุทั้ง 2 อย่างจึงเหมาะอย่างยิ่งสำหรับ อย่างใดอย่างหนึ่ง เช่น หากหน้าจอจริงกว้าง 720 dp x สูง 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 ความหนาแน่นปานกลางดั้งเดิม ขนาดเลย์เอาต์ขั้นต่ำสำหรับหน้าจอขนาดใหญ่คือ หน่วยประมาณ 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() ด้วย ซึ่งระบุว่าหน้าจอกลมหรือไม่

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

เพิ่มใน API ระดับ 26 แล้ว

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

ช่วงไดนามิกกว้าง (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 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: ตรงกับความหนาแน่นของหน้าจอทั้งหมดและมีลำดับความสำคัญเหนือ ตัวระบุอื่นๆ ด้วย วิธีนี้เป็นประโยชน์สำหรับ เวกเตอร์ที่ถอนออกได้ เพิ่มใน API ระดับ 21
  • nnndpi: ใช้เพื่อแสดงความหนาแน่นที่ไม่เป็นมาตรฐาน โดยที่ nnn คือความหนาแน่นของหน้าจอที่เป็นจำนวนเต็มบวก ช่วงเวลานี้ ไม่มีการใช้ในกรณีส่วนใหญ่ การใช้ที่เก็บข้อมูลความหนาแน่นมาตรฐานจะลดลงอย่างมาก ค่าใช้จ่ายในการรองรับความหนาแน่นของหน้าจออุปกรณ์ต่างๆ ในตลาด

มีอัตราส่วนการปรับขนาดเป็น 3:4:6:8:12:16 ระหว่างความหนาแน่นหลัก 6 รายการ (โดยไม่สนใจ ความหนาแน่นของ 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 ขึ้นไป) โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับค่าเหล่านี้ในเอกสารระดับ Android API

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

กฎชื่อคุณสมบัติ

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

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

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

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

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

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

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

ถอนออกได้

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

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

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

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

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

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

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

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

Android ค้นหาแหล่งข้อมูลที่ตรงกันที่สุดได้อย่างไร

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

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

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

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

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

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

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

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

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

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

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

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

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

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