แหล่งข้อมูลคือ ไฟล์เพิ่มเติมและเนื้อหาแบบคงที่ที่โค้ดของคุณใช้ เช่น บิตแมป เลย์เอาต์ สตริงอินเทอร์เฟซผู้ใช้ คำแนะนำเกี่ยวกับภาพเคลื่อนไหว และอื่นๆ อีกมากมาย
ภายนอกทรัพยากรของแอป เช่น รูปภาพและสตริง จาก เพื่อให้คุณดูแลรักษาแยกต่างหากได้ รวมทั้งให้แหล่งข้อมูลอื่นสำหรับ การกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจงโดยจัดกลุ่มไว้ในไดเรกทอรีทรัพยากรที่มีชื่อพิเศษ ที่ 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,
ดูข้อมูลเพิ่มเติมได้ที่แหล่งข้อมูลที่ถอนออกได้ |
mipmap/ |
ไฟล์ที่วาดได้สำหรับความหนาแน่นของไอคอน Launcher ที่ต่างกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการ
ไอคอน Launcher ที่มี mipmap/ โฟลเดอร์ โปรดดู
ใส่ไอคอนแอปไว้
ไดเรกทอรี Mipmap |
layout/ |
ไฟล์ XML ที่กำหนดเลย์เอาต์ของอินเทอร์เฟซผู้ใช้ ดูข้อมูลเพิ่มเติมได้ที่แหล่งข้อมูลของเลย์เอาต์ |
menu/ |
ไฟล์ XML ที่กำหนดเมนูของแอป เช่น เมนูตัวเลือก เมนูตามบริบท หรือเมนูย่อย ดูข้อมูลเพิ่มเติมได้ที่แหล่งข้อมูลของเมนู |
raw/ |
ไฟล์ที่กำหนดเองที่จะบันทึกในรูปแบบข้อมูลดิบ หากต้องการเปิดทรัพยากรเหล่านี้ด้วยไฟล์ RAW
อย่างไรก็ตาม หากคุณต้องการเข้าถึงชื่อไฟล์และลำดับชั้นของไฟล์ต้นฉบับ โปรดพิจารณา
บันทึกทรัพยากรในไดเรกทอรี |
values/ |
ไฟล์ XML ที่มีค่าง่ายๆ เช่น สตริง จำนวนเต็ม และสี ในขณะที่ไฟล์ทรัพยากร XML ในไดเรกทอรีย่อย เนื่องจากทรัพยากรแต่ละรายการถูกกำหนดด้วยองค์ประกอบ XML ของตัวเอง คุณจึงตั้งชื่อไฟล์ได้ ที่คุณต้องการและวางประเภททรัพยากร ต่างๆ ไว้ในไฟล์เดียว แต่เพื่อความชัดเจน คุณอาจ ต้องการวางประเภททรัพยากรที่ไม่ซ้ำกัน ในไฟล์ต่างๆ เช่น ลองดูชื่อไฟล์ต่อไปนี้ สำหรับทรัพยากรที่คุณสามารถสร้างในไดเรกทอรีนี้
โปรดดูข้อมูลเพิ่มเติมที่หัวข้อทรัพยากรสตริง แหล่งข้อมูลรูปแบบ และ ประเภททรัพยากรเพิ่มเติม |
xml/ |
ไฟล์ XML ที่กําหนดเองซึ่งอ่านได้ขณะรันไทม์โดยการเรียกใช้ Resources.getXML() ไฟล์การกำหนดค่า XML ต่างๆ
ต้องบันทึกที่นี่ เช่น การกำหนดค่าการค้นหา
|
font/ |
ไฟล์แบบอักษรที่มีนามสกุล เช่น TTF, OTF
หรือไฟล์ TTC หรือไฟล์ XML ที่
รวมเอลิเมนต์ <font-family> สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ
แบบอักษรเป็นทรัพยากร โปรดดู
เพิ่มแบบอักษรเป็นทรัพยากร XML
|
ข้อควรระวัง: อย่าบันทึกไฟล์ทรัพยากรไว้ภายใน
ไดเรกทอรี res/
ทำให้เกิดข้อผิดพลาดของคอมไพเลอร์
โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากรแต่ละประเภทที่ภาพรวมของประเภททรัพยากร
ทรัพยากรที่คุณบันทึกไว้ในไดเรกทอรีย่อยที่กำหนดไว้ในตาราง 1 เป็นค่าเริ่มต้นของคุณ ที่ไม่ซับซ้อน กล่าวคือ ทรัพยากรเหล่านี้จะกำหนดการออกแบบและเนื้อหาเริ่มต้นสำหรับแอปของคุณ อย่างไรก็ตาม อุปกรณ์ที่ใช้ระบบ Android ประเภทต่างๆ อาจต้องใช้ทรัพยากรประเภทที่แตกต่างกัน
เช่น คุณอาจให้ทรัพยากรเลย์เอาต์แบบต่างๆ สำหรับอุปกรณ์ที่มีขนาดใหญ่กว่าปกติ เพื่อใช้ประโยชน์จากพื้นที่หน้าจอเพิ่มเติม คุณยังระบุทรัพยากรสตริงต่างๆ ได้ด้วย ที่แปลข้อความในอินเทอร์เฟซผู้ใช้ของคุณตามการตั้งค่าภาษาของอุปกรณ์ การระบุ ข้อมูลเหล่านี้บนอุปกรณ์ต่างๆ การกำหนดค่าเอง คุณจำเป็นต้องระบุทรัพยากรอื่นนอกเหนือไปจากค่าเริ่มต้น ที่ไม่ซับซ้อน
ระบุแหล่งข้อมูลอื่น
แอปส่วนใหญ่มีทรัพยากรทางเลือกเพื่อรองรับอุปกรณ์บางประเภท การกำหนดค่าเอง ตัวอย่างเช่น รวมทรัพยากรที่ถอนออกได้อื่นๆ สำหรับ ความหนาแน่นของหน้าจอและทรัพยากรสตริงทางเลือกสำหรับภาษาต่างๆ ขณะรันไทม์ Android ตรวจพบการกำหนดค่าอุปกรณ์ปัจจุบัน และโหลดการกำหนดค่า ทรัพยากรสำหรับแอปของคุณ
![](https://developer.android.com/static/images/resources/resource_devices_diagram2.png?authuser=8&hl=th)
รูปที่ 1 อุปกรณ์ 2 เครื่องใช้ทรัพยากรเลย์เอาต์ที่แตกต่างกันตามขนาดหน้าจอ
ในการระบุทางเลือกเฉพาะการกำหนดค่าสำหรับชุดทรัพยากร ให้ทำดังนี้
- สร้างไดเรกทอรีใหม่ใน
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 เลือก
ของแหล่งข้อมูลแต่ละรายการ ซึ่งตรงกับอุปกรณ์ปัจจุบันมากที่สุดด้วยการเปรียบเทียบอุปกรณ์
ข้อมูลการกำหนดค่าด้วยตัวระบุในชื่อไดเรกทอรีทรัพยากร
ข้อควรระวัง: เมื่อกำหนดทรัพยากรอื่น โปรดตรวจสอบว่า
กำหนดทรัพยากรในการกำหนดค่าเริ่มต้นด้วย ไม่เช่นนั้น แอปอาจเจอรันไทม์
เมื่ออุปกรณ์เปลี่ยนการกำหนดค่า เช่น หากคุณเพิ่มสตริงให้กับ
values-en
ไม่ใช่ values
แอปของคุณอาจพบปัญหา
ข้อยกเว้น Resource Not Found
รายการเมื่อผู้ใช้เปลี่ยนภาษาเริ่มต้นของระบบ
ตารางที่ 2 จะแสดงรายการตัวระบุการกำหนดค่าที่ถูกต้องตามลำดับความสำคัญ คุณสามารถ เพิ่มตัวระบุหลายตัวลงในชื่อไดเรกทอรีเดียวโดยคั่นตัวระบุแต่ละรายการด้วยเครื่องหมายขีด หากคุณใช้ ตัวระบุหลายตัวสำหรับไดเรกทอรีทรัพยากร คุณต้องเพิ่มตัวระบุลงในชื่อไดเรกทอรีตามลำดับ แสดงในตาราง
ตาราง 2 ตัวระบุการกําหนดค่า
การกำหนดค่า | ค่าตัวระบุ | คำอธิบาย |
---|---|---|
MCC และ MNC | ตัวอย่าง:mcc310
mcc208-mnc00
|
รหัสประเทศของอุปกรณ์เคลื่อนที่ (MCC) ตามด้วยรหัสเครือข่ายมือถือ (MNC) หรือไม่ก็ได้
จากซิมการ์ดในอุปกรณ์ เช่น หากอุปกรณ์ใช้การเชื่อมต่อวิทยุ (เป็นโทรศัพท์ GSM) ระบบจะแสดงค่า MCC และ MNC ออกจากซิมการ์ด คุณสามารถใช้ MCC เพียงอย่างเดียวได้ เช่น เพื่อรวมกฎหมายเฉพาะประเทศ ทรัพยากรในแอปของคุณ หากคุณต้องการระบุตามภาษาเท่านั้น ให้ใช้ ตัวระบุภาษา สคริปต์ (ไม่บังคับ) และภูมิภาค (ไม่บังคับ) แทน หากคุณใช้ 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 ตัวอักษร (ขึ้นต้นด้วย
ตัวพิมพ์เล็ก โค้ดไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คำนำหน้า Android 7.0 (API ระดับ 24) เปิดตัวการรองรับสำหรับ BCP 47 แท็กภาษาที่คุณสามารถใช้เพื่อคัดกรองภาษา และ แหล่งข้อมูลเฉพาะภูมิภาค แท็กภาษาสร้างขึ้นจากลำดับของ แท็กย่อยอย่างน้อย 1 แท็ก โดยแต่ละแท็กจะปรับหรือจำกัดช่วงของ ภาษาที่ระบุโดยแท็กโดยรวม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ สำหรับแท็กภาษา โปรดดูแท็กสำหรับการระบุภาษา หากต้องการใช้แท็กภาษา BCP 47 ให้เชื่อมต่อ
แท็กภาษาอาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอป หาก ผู้ใช้จะเปลี่ยนภาษาในการตั้งค่าระบบได้ สำหรับข้อมูลเกี่ยวกับ จะส่งผลต่อแอปในระหว่างรันไทม์อย่างไร โปรดดูที่แฮนเดิล การเปลี่ยนแปลงการกำหนดค่า สำหรับคู่มือฉบับเต็มในการแปลแอปของคุณเป็นภาษาอื่น โปรดดูการแปลแอปของคุณ โปรดดูเมธอด |
ทิศทางของเลย์เอาต์ | ldrtl ldltr |
ทิศทางเลย์เอาต์ของแอป ซึ่งจะมีผลกับทรัพยากรทั้งหมด เช่น เลย์เอาต์ ทรัพยากรที่ถอนออกได้ หรือค่า ตัวอย่างเช่น ถ้าคุณต้องการแสดงเค้าโครงเฉพาะสำหรับภาษาอาหรับและ การจัดวางทั่วไปสำหรับ "ขวาไปซ้าย" อื่นๆ เช่น เปอร์เซียหรือ ภาษาฮีบรู จากนั้นคุณใช้ไดเรกทอรีดังตัวอย่างต่อไปนี้
หมายเหตุ: วิธีเปิดใช้ฟีเจอร์เลย์เอาต์แบบอ่านจากขวาไปซ้าย
สําหรับแอป คุณต้องตั้ง เพิ่มใน API ระดับ 17 แล้ว |
ความกว้างที่เล็กที่สุด | sw<N>dp ตัวอย่าง: sw320dp
sw600dp sw720dp อื่นๆ |
ขนาดที่สั้นที่สุดของพื้นที่หน้าจอที่มีในแอป
โดยเฉพาะอย่างยิ่ง
เช่น หากเลย์เอาต์กำหนดให้มีขนาดหน้าจอที่เล็กที่สุด
พื้นที่อย่างน้อย 600 dp ตลอดเวลา คุณสามารถใช้ตัวระบุนี้เพื่อ
สร้างทรัพยากรเลย์เอาต์ในไดเรกทอรี ใช้ความกว้างที่เล็กที่สุดเพื่อระบุ ขนาดหน้าจอทั่วไปมีประโยชน์ เนื่องจากความกว้างมักเป็นปัจจัยที่ขับเคลื่อน การออกแบบเลย์เอาต์ UI มักเลื่อนในแนวตั้งแต่ค่อนข้างยาก พื้นที่ขั้นต่ำที่ต้องใช้ในแนวนอน ความกว้างที่มีให้เลือก เป็นปัจจัยสำคัญในการพิจารณาว่าควรใช้ เลย์เอาต์แบบแผงเดียว โทรศัพท์มือถือหรือรูปแบบแบบหลายช่องสำหรับแท็บเล็ต ดังนั้นคุณน่าจะสนใจเกี่ยวกับ ความกว้างที่เล็กที่สุดที่เป็นไปได้ในอุปกรณ์แต่ละเครื่อง ความกว้างที่เล็กที่สุดของอุปกรณ์จะพิจารณาจากการตกแต่งหน้าจอและ UI ของระบบ ตัวอย่างเช่น ถ้าอุปกรณ์มีองค์ประกอบ UI ตลอดเวลาใน พื้นที่ตามแกนของความกว้างที่เล็กที่สุด ระบบ ขอบอกว่าความกว้างที่เล็กที่สุดนั้นเล็กกว่าขนาดหน้าจอจริงเพราะ พิกเซลหน้าจอไม่พร้อมใช้งานสำหรับ UI ของคุณ ค่าบางค่าที่คุณอาจใช้ที่นี่สำหรับขนาดหน้าจอทั่วไปมีดังนี้
เมื่อแอปของคุณมีไดเรกทอรีทรัพยากรหลายรายการที่มีค่าต่างกันสำหรับ
ตัวระบุ เพิ่มใน API ระดับ 13 แล้ว โปรดดู สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการออกแบบสำหรับหน้าจอต่างๆ โดยใช้ตัวระบุนี้ โปรดดู การออกแบบที่ปรับเปลี่ยนตามอุปกรณ์/ปรับเปลี่ยนได้พร้อมด้วยยอดดู |
ความกว้างและความสูงที่ใช้ได้ | w<N>dp h<N>dp ตัวอย่าง: w720dp w1024dp h720dp h1024dp อื่นๆ |
ระบุความกว้างหรือความสูงของหน้าจอขั้นต่ำที่มี (กำหนดไว้ ความกว้างและความสูงที่ใช้ได้มักจะมีประโยชน์ในการพิจารณาว่าจะใช้หลายหน้าต่างหรือไม่ เพราะแม้แต่บนอุปกรณ์แท็บเล็ต คุณก็มักไม่ต้องการการจัดวางแบบหลายช่องแบบเดียวกัน สำหรับการวางในแนวตั้ง เช่นเดียวกับแนวนอน ดังนั้น คุณสามารถใช้ข้อมูลเหล่านี้เพื่อระบุ ความกว้างและ/หรือความสูงขั้นต่ำที่กำหนดสำหรับการออกแบบ แทนที่จะใช้ทั้งขนาดหน้าจอ และตัวระบุการวางแนว เมื่อแอปให้ไดเรกทอรีทรัพยากรหลายรายการที่มีค่าต่างกัน สำหรับการกำหนดค่าเหล่านี้ ระบบจะใช้รายการที่ใกล้เคียงที่สุด (โดยไม่เกิน) ความกว้างหน้าจอปัจจุบันของอุปกรณ์ ที่ใกล้เคียงที่สุดจะพิจารณาจากการบวกความแตกต่าง ความกว้างหน้าจอจริงกับความกว้างที่ระบุ เทียบกับความแตกต่างระหว่าง ความสูงหน้าจอจริงและความสูงที่ระบุ พร้อมความสูงและความกว้างที่ไม่ได้ระบุ มีค่าเป็น 0 ค่าเหล่านี้ไม่รวมพื้นที่ที่มี
ส่วนที่เว้นไว้ในหน้าต่าง ดังนั้นหากอุปกรณ์มี
องค์ประกอบ UI ถาวรที่ขอบของจอแสดงผล ค่าความกว้างและความสูงจะ
เล็กกว่าขนาดหน้าจอจริงแม้ว่าแอปจะแสดงอยู่ที่ขอบถึงขอบเดียว
โดยใช้
การตกแต่งหน้าจอแนวตั้งบางอย่างที่ยังไม่ได้แก้ไข (เช่น โทรศัพท์ แถบสถานะที่สามารถซ่อนได้เมื่อเต็มหน้าจอ) จะไม่นำมาพิจารณาในส่วนนี้ หรือ เป็นของตกแต่งหน้าต่าง เช่น แถบชื่อหรือแถบการทำงาน ดังนั้นแอปจึงต้องเตรียมพร้อมที่จะดีล ด้วยพื้นที่ที่ค่อนข้างเล็กกว่าที่ระบุ หมายเหตุ: ระบบจะเลือกทรัพยากรที่ตรงกันทั้ง 2 รายการใน ความกว้างและความสูง ดังนั้นทรัพยากรที่ระบุทั้ง 2 อย่างจึงเหมาะอย่างยิ่งสำหรับ อย่างใดอย่างหนึ่ง เช่น หากหน้าจอจริงกว้าง 720 dp x สูง 1280 dp และทรัพยากรหนึ่งมีคุณสมบัติเท่ากับ w720dp และอีกทรัพยากรหนึ่งมีคุณสมบัติเป็น w700dp-h1200dp ระบบจะเลือกรายการหลัง แม้ว่ารูปแบบแรกจะตรงกันทุกประการกับ ที่เราระบุไว้ เพิ่มใน API ระดับ 13 แล้ว ดู สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการออกแบบสำหรับหน้าจอต่างๆ โดยใช้ตัวระบุนี้ โปรดดู การออกแบบที่ปรับเปลี่ยนตามอุปกรณ์/ปรับเปลี่ยนได้พร้อมด้วยยอดดู |
ขนาดหน้าจอ |
small normal large xlarge
|
หมายเหตุ: การใช้ตัวระบุขนาด ไม่ได้กล่าวเป็นนัยว่าทรัพยากรมีไว้สำหรับหน้าจอขนาดดังกล่าวเท่านั้น หากไม่ ให้ทรัพยากรทางเลือกที่มีตัวระบุที่ตรงกับอุปกรณ์ปัจจุบันมากกว่า ระบบจะเลือกใช้ทรัพยากรใดๆ ก็ตามที่ดีที่สุด ที่ตรงกัน ข้อควรระวัง: หากทรัพยากรทั้งหมดใช้ขนาด
ที่ใหญ่กว่าหน้าจอปัจจุบัน ระบบ
ไม่ได้นำไปใช้ และแอปของคุณขัดข้องระหว่างรันไทม์ เหตุการณ์นี้จะเกิดขึ้น ตัวอย่างเช่น หากการจัดวางทั้งหมด
ทรัพยากรมีการติดแท็กด้วยตัวระบุ เพิ่มใน API ระดับ 4 แล้ว ดู สำหรับข้อมูลเพิ่มเติม โปรดดูที่หน้าจอ ภาพรวมความเข้ากันได้ |
หน้าจอ |
long notlong
|
เพิ่มใน API ระดับ 4 แล้ว ทั้งนี้ ขึ้นอยู่กับสัดส่วนการแสดงผลของหน้าจอเท่านั้น (หน้าจอ โปรดดูช่องการกำหนดค่า |
หน้าจอกลม |
round notround
|
เพิ่มใน API ระดับ 23 แล้ว ดูการกำหนดค่า |
ขอบเขตสีที่กว้าง |
widecg nowidecg
|
เพิ่มใน API ระดับ 26 แล้ว ดูการกำหนดค่า |
ช่วงไดนามิกกว้าง (HDR) |
highdr lowdr
|
เพิ่มใน API ระดับ 26 แล้ว ดูการกำหนดค่า |
การวางแนวหน้าจอ |
port land
|
ซึ่งอาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากผู้ใช้หมุน บนหน้าจอ ดูข้อมูลเกี่ยวกับผลกระทบที่มีต่อแอประหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า โปรดดูช่องการกำหนดค่า |
โหมด UI |
car desk television appliance watch vrheadset
|
เพิ่มไว้ใน API ระดับ 8 โทรทัศน์ที่เพิ่มใน API 13 ที่เพิ่มใน API 20 สำหรับข้อมูลเกี่ยวกับวิธีที่แอปของคุณสามารถตอบสนองเมื่อเสียบอุปกรณ์ลงใน นำออกจากแท่นชาร์จ โปรดอ่านระบุและตรวจสอบ สถานะและประเภทการเชื่อมต่อระหว่างอุปกรณ์ ซึ่งอาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากผู้ใช้วางอุปกรณ์
วางบนแท่นชาร์จ คุณสามารถเปิดหรือปิดใช้บางโหมดได้โดยใช้
|
โหมดกลางคืน |
night notnight
|
เพิ่มใน API ระดับ 8 แล้ว การดำเนินการนี้อาจเปลี่ยนแปลงในระหว่างอายุการใช้งานของแอปหากมีการเปิดโหมดกลางคืนไว้
โหมดอัตโนมัติ (ค่าเริ่มต้น) ซึ่งในกรณีนี้โหมดจะเปลี่ยนตามช่วงเวลาของวัน คุณสามารถเปิดใช้
หรือปิดใช้โหมดนี้โดยใช้ |
ความหนาแน่นของพิกเซลหน้าจอ (dpi) |
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi nnndpi
|
มีอัตราส่วนการปรับขนาดเป็น 3:4:6:8:12:16 ระหว่างความหนาแน่นหลัก 6 รายการ (โดยไม่สนใจ ความหนาแน่นของ tvdpi) ดังนั้น บิตแมป 9x9 ใน ldpi คือ 12x12 ใน mdpi, 18x18 ใน hdpi, 24x24 ใน xhdpi เป็นต้น หมายเหตุ: การใช้ตัวระบุความหนาแน่นไม่ได้หมายความว่า ทรัพยากรมีเท่านั้นสำหรับหน้าจอที่มีความหนาแน่นดังกล่าว หากไม่ได้ระบุทางเลือก ที่มีตัวระบุที่ตรงกับการกำหนดค่าอุปกรณ์ปัจจุบันมากกว่า ระบบจะเลือกใช้ แหล่งข้อมูลใดก็ตามที่ตรงที่สุด สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการกับความหนาแน่นของหน้าจอที่แตกต่างกันและวิธีการที่ Android อาจปรับขนาดบิตแมปของคุณให้พอดีกับความหนาแน่นปัจจุบัน โปรดดู ภาพรวมความเข้ากันได้ของหน้าจอ |
ประเภทหน้าจอสัมผัส |
notouch finger
|
โปรดดูช่องการกำหนดค่า |
ความพร้อมใช้งานของแป้นพิมพ์ |
keysexposed keyshidden keyssoft
|
หากคุณให้ทรัพยากร ซึ่งอาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากผู้ใช้เปิดฮาร์ดแวร์ แป้นพิมพ์ ดูข้อมูลเกี่ยวกับผลกระทบที่มีต่อแอประหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า โปรดดูช่องการกำหนดค่า |
วิธีการป้อนข้อความหลัก |
nokeys qwerty 12key
|
โปรดดูช่องการกำหนดค่า |
ความพร้อมใช้งานของแป้นนำทาง |
navexposed navhidden
|
ซึ่งอาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากผู้ใช้แสดงการนำทาง คีย์ ดูข้อมูลเกี่ยวกับผลกระทบที่มีต่อแอประหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า ดูการกำหนดค่า |
วิธีหลักในการไปยังส่วนต่างๆ แบบไม่สัมผัส |
nonav dpad trackball wheel
|
โปรดดูช่องการกำหนดค่า |
เวอร์ชันแพลตฟอร์ม (ระดับ API) | ตัวอย่าง:v3
v4 v7 อื่นๆ |
ระดับ 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
ระบบตัดสินใจว่าจะใช้ทรัพยากรใดกับรายการต่อไปนี้ ตรรกะ:
![](https://developer.android.com/static/images/resources/res-selection-flowchart.png?authuser=8&hl=th)
รูปที่ 2 โฟลว์ชาร์ตแสดงวิธีที่ Android พบ ที่สุด
- กำจัดไฟล์ทรัพยากรที่ขัดแย้งกับการกำหนดค่าอุปกรณ์
ไดเรกทอรี
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) (เริ่มต้นด้วย MCC)
- มีไดเรกทอรีทรัพยากรที่มีตัวระบุนี้หรือไม่
- หากไม่ใช่ ให้กลับไปที่ขั้นตอนที่ 2 และดูที่ตัวระบุถัดไป ในตัวอย่างนี้ คำตอบคือ "ไม่" จนกว่าจะถึงตัวระบุภาษา
- หากใช่ ให้ไปที่ขั้นตอนที่ 4
- กำจัดไดเรกทอรีทรัพยากรที่ไม่มีตัวระบุนี้ ในตัวอย่างนี้ ระบบ
Next จะลบไดเรกทอรีทั้งหมดที่ไม่มีตัวระบุภาษา ดังนี้
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/ข้อยกเว้น: หากตัวระบุที่เป็นปัญหาคือความหนาแน่นของพิกเซลหน้าจอ Android จะเลือกตัวเลือกที่ตรงกับความหนาแน่นของหน้าจออุปกรณ์มากที่สุด โดยทั่วไปแล้ว Android ต้องการลดขนาดรูปภาพต้นฉบับที่มีขนาดใหญ่ขึ้นเพื่อปรับขนาดให้เล็กลง ภาพต้นฉบับ สำหรับข้อมูลเพิ่มเติม โปรดดูที่หน้าจอ ภาพรวมความเข้ากันได้
- ทำขั้นตอนที่ 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
ถูกนำออกแล้ว