ทรัพยากรคือ ไฟล์เพิ่มเติมและเนื้อหาแบบคงที่ที่โค้ดของคุณใช้ เช่น บิตแมป คำจำกัดความของเลย์เอาต์ สตริงของอินเทอร์เฟซผู้ใช้ คำสั่งภาพเคลื่อนไหว และอื่นๆ
แยกทรัพยากรของแอป เช่น รูปภาพและสตริง ออกจากโค้ดเสมอ เพื่อให้คุณดูแลทรัพยากรเหล่านั้นได้อย่างอิสระ นอกจากนี้ ให้ระบุทรัพยากรทางเลือกสำหรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจงโดยจัดกลุ่มไว้ในไดเรกทอรีทรัพยากรที่มีชื่อเฉพาะ ในเวลา รันไทม์ 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,
ดูข้อมูลเพิ่มเติมได้ที่ทรัพยากร Drawable |
mipmap/ |
ไฟล์ Drawable สำหรับความหนาแน่นของไอคอน 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 ประเภทต่างๆ อาจต้องใช้ทรัพยากรประเภทต่างๆ
เช่น คุณสามารถระบุแหล่งข้อมูลเลย์เอาต์ที่แตกต่างกันสำหรับอุปกรณ์ที่มีหน้าจอใหญ่กว่าปกติ เพื่อใช้ประโยชน์จากพื้นที่หน้าจอเพิ่มเติม นอกจากนี้ คุณยังระบุทรัพยากรสตริงที่แตกต่างกัน ซึ่งแปลข้อความในอินเทอร์เฟซผู้ใช้ตามการตั้งค่าภาษาของอุปกรณ์ได้ด้วย หากต้องการระบุแหล่งข้อมูลต่างๆ เหล่านี้สำหรับการกำหนดค่าอุปกรณ์ที่แตกต่างกัน คุณต้องระบุแหล่งข้อมูลสำรองนอกเหนือจากแหล่งข้อมูลเริ่มต้น
จัดหาแหล่งข้อมูลทางเลือก
แอปส่วนใหญ่มีแหล่งข้อมูลสำรองเพื่อรองรับการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจง เช่น ใส่ทรัพยากร Drawable ทางเลือกสำหรับความหนาแน่นของหน้าจอที่แตกต่างกัน และทรัพยากรสตริงทางเลือกสำหรับภาษาต่างๆ ในขณะรันไทม์ Android จะตรวจหาการกำหนดค่าอุปกรณ์ปัจจุบันและโหลด ทรัพยากรที่เหมาะสมสำหรับแอป
รูปที่ 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 จะเลือก
เวอร์ชันของทรัพยากรแต่ละรายการที่ตรงกับอุปกรณ์ปัจจุบันมากที่สุดโดยการเปรียบเทียบข้อมูลการกำหนดค่า
อุปกรณ์กับตัวระบุในชื่อไดเรกทอรีทรัพยากร
ข้อควรระวัง: เมื่อกำหนดทรัพยากรสำรอง โปรดตรวจสอบว่าคุณได้กำหนดทรัพยากรในการกำหนดค่าเริ่มต้นด้วย ไม่เช่นนั้น แอปอาจพบข้อยกเว้นรันไทม์
เมื่ออุปกรณ์เปลี่ยนการกำหนดค่า เช่น หากคุณเพิ่มสตริงลงใน only
values-en แต่ไม่ได้เพิ่มลงใน values แอปอาจพบข้อยกเว้น
Resource Not Found เมื่อผู้ใช้เปลี่ยนภาษาของระบบเริ่มต้น
ตารางที่ 2 แสดงตัวระบุการกำหนดค่าที่ถูกต้องตามลำดับความสำคัญ คุณ เพิ่มตัวระบุหลายรายการลงในชื่อไดเรกทอรีเดียวได้โดยคั่นตัวระบุแต่ละรายการด้วยขีดกลาง หากใช้ ตัวระบุหลายรายการสำหรับไดเรกทอรีทรัพยากร คุณต้องเพิ่มตัวระบุเหล่านั้นลงในชื่อไดเรกทอรีตามลำดับที่ แสดงในตาราง
ตารางที่ 2 ชื่อ ตัวระบุการกำหนดค่า
| การกำหนดค่า | ค่าตัวระบุ | คำอธิบาย |
|---|---|---|
| MCC และ MNC | ตัวอย่างmcc310mcc208-mnc00
|
รหัสประเทศของอุปกรณ์เคลื่อนที่ (MCC) ตามด้วยรหัสเครือข่ายของอุปกรณ์เคลื่อนที่ (MNC) ซึ่งไม่บังคับ
จากซิมการ์ดในอุปกรณ์ เช่น หากอุปกรณ์ใช้การเชื่อมต่อวิทยุ (เช่น โทรศัพท์ GSM) ค่า MCC และ MNC จะมาจากซิมการ์ด นอกจากนี้ คุณยังใช้ MCC เพียงอย่างเดียวได้ด้วย เช่น เพื่อรวมแหล่งข้อมูลทางกฎหมายเฉพาะประเทศไว้ในแอป หากต้องการระบุตามภาษาเท่านั้น ให้ใช้ตัวระบุภาษา สคริปต์ (ไม่บังคับ) และภูมิภาค (ไม่บังคับ) แทน หากใช้ตัวระบุ MCC และ MNC ให้ใช้ด้วยความระมัดระวังและทดสอบว่าทำงานได้ตามที่คาดไว้ นอกจากนี้ โปรดดูฟิลด์การกำหนดค่า |
| ภาษา สคริปต์ (ไม่บังคับ) และภูมิภาค (ไม่บังคับ) | ตัวอย่างenfren-rUSfr-rFRfr-rCAb+enb+en+USb+es+419b+zh+Hantb+sr+Latn+RS |
ภาษาจะกำหนดโดยรหัสภาษาแบบ 2 ตัวอักษรตามมาตรฐาน ISO 639-1 ซึ่งอาจตามด้วยรหัสภูมิภาคแบบ 2 ตัวอักษรตามมาตรฐาน ISO 3166-1-alpha-2 (นำหน้าด้วย รหัสไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คำนำหน้า Android 7.0 (API ระดับ 24) ได้เปิดตัวการรองรับแท็กภาษา BCP 47 ซึ่งคุณใช้เพื่อระบุทรัพยากรที่เจาะจงภาษาและภูมิภาคได้ แท็กภาษาประกอบด้วยลำดับของ แท็กย่อยอย่างน้อย 1 รายการ ซึ่งแต่ละรายการจะปรับแต่งหรือจำกัดช่วงของ ภาษาที่ระบุโดยแท็กโดยรวม ดูข้อมูลเพิ่มเติมเกี่ยวกับ แท็กภาษาได้ที่แท็กสำหรับระบุภาษา หากต้องการใช้แท็กภาษา BCP 47 ให้ต่อ แท็กภาษาอาจเปลี่ยนแปลงได้ตลอดอายุของแอป หาก ผู้ใช้เปลี่ยนภาษาในการตั้งค่าระบบ ดูข้อมูลเกี่ยวกับ วิธีที่การเปลี่ยนแปลงนี้อาจส่งผลต่อแอปของคุณในระหว่างรันไทม์ได้ที่หัวข้อจัดการ การเปลี่ยนแปลงการกำหนดค่า ดูคำแนะนำฉบับสมบูรณ์เกี่ยวกับการแปลแอปเป็นภาษาอื่นๆ ได้ที่แปลแอป ดู |
| ทิศทางเลย์เอาต์ | ldrtlldltr |
ทิศทางเลย์เอาต์ของแอป ซึ่งใช้ได้กับทรัพยากรทุกอย่าง เช่น เลย์เอาต์ Drawable หรือค่า ตัวอย่างเช่น หากต้องการระบุเลย์เอาต์สำหรับภาษาอาหรับและเลย์เอาต์ทั่วไปสำหรับภาษาอื่นๆ ที่ "อ่านจากขวาไปซ้าย" เช่น เปอร์เซียหรือฮีบรู คุณจะต้องใช้ไดเรกทอรีดังต่อไปนี้
หมายเหตุ: หากต้องการเปิดใช้ฟีเจอร์เลย์เอาต์จากขวาไปซ้าย
สำหรับแอป คุณต้องตั้งค่า เพิ่มใน API ระดับ 17 |
| ความกว้างที่เล็กที่สุด | sw<N>dpตัวอย่าง sw320dpsw600dpsw720dpฯลฯ |
ขนาดที่สั้นที่สุดของพื้นที่หน้าจอที่แอปใช้ได้
กล่าวคือ
เช่น หากเลย์เอาต์กำหนดให้ขนาดที่เล็กที่สุดของพื้นที่หน้าจอต้องมีอย่างน้อย 600 dp เสมอ คุณก็ใช้ตัวระบุนี้เพื่อสร้างทรัพยากรเลย์เอาต์ในไดเรกทอรี การใช้ความกว้างที่เล็กที่สุดเพื่อกำหนดขนาดหน้าจอทั่วไปมีประโยชน์เนื่องจากความกว้างมักเป็นปัจจัยสำคัญในการออกแบบเลย์เอาต์ โดยปกติแล้ว UI จะเลื่อนในแนวตั้ง แต่มีข้อจำกัดที่ค่อนข้างเข้มงวดเกี่ยวกับพื้นที่ขั้นต่ำที่ต้องใช้ในแนวนอน ความกว้างที่ใช้ได้ ยังเป็นปัจจัยสำคัญในการพิจารณาว่าจะใช้เลย์เอาต์แบบ 1 บานหน้าต่างสำหรับ โทรศัพท์มือถือหรือเลย์เอาต์แบบหลายบานหน้าต่างสำหรับแท็บเล็ต ดังนั้น คุณจึงน่าจะสนใจมากที่สุดว่า ความกว้างที่เล็กที่สุดที่เป็นไปได้ในแต่ละอุปกรณ์คือเท่าใด ความกว้างที่เล็กที่สุดของอุปกรณ์จะพิจารณาถึงการตกแต่งหน้าจอและ UI ของระบบ เช่น หากอุปกรณ์มีองค์ประกอบ UI แบบถาวรบนหน้าจอที่ใช้พื้นที่ตามแกนความกว้างที่เล็กที่สุด ระบบจะประกาศว่าความกว้างที่เล็กที่สุดนั้นเล็กกว่าขนาดหน้าจอจริง เนื่องจากพิกเซลเหล่านั้นเป็นพิกเซลหน้าจอที่ UI ของคุณใช้ไม่ได้ ค่าบางอย่างที่คุณอาจใช้ที่นี่สำหรับขนาดหน้าจอทั่วไปมีดังนี้
เมื่อแอปมีไดเรกทอรีทรัพยากรหลายรายการที่มีค่าแตกต่างกันสำหรับตัวระบุ เพิ่มใน API ระดับ 13 ดู ดูข้อมูลเพิ่มเติมเกี่ยวกับการออกแบบสำหรับหน้าจอต่างๆ โดยใช้ตัวระบุนี้ได้ที่ การออกแบบที่ตอบสนองตามอุปกรณ์/การออกแบบที่ปรับตามอุปกรณ์ด้วยมุมมอง |
| ความกว้างและความสูงที่ใช้ได้ | w<N>dph<N>dpตัวอย่าง: w720dpw1024dph720dph1024dpฯลฯ |
ระบุความกว้างหรือความสูงของหน้าจอขั้นต่ำที่ใช้ได้ (ใน ความกว้างและความสูงที่ใช้ได้มักมีประโยชน์ในการพิจารณาว่าจะใช้เลย์เอาต์แบบหลายบานหน้าต่างหรือไม่ เนื่องจากแม้ในอุปกรณ์แท็บเล็ต คุณก็มักไม่ต้องการเลย์เอาต์แบบหลายบานหน้าต่างเดียวกันสำหรับแนวตั้งกับแนวนอน ดังนั้น คุณจึงใช้ตัวระบุเหล่านี้เพื่อระบุความกว้างและ/หรือความสูงขั้นต่ำที่จำเป็นสำหรับเลย์เอาต์แทนการใช้ทั้งตัวระบุขนาดหน้าจอและตัวระบุการวางแนวร่วมกันได้ เมื่อแอปมีไดเรกทอรีทรัพยากรหลายรายการที่มีค่าแตกต่างกัน สำหรับการกำหนดค่าเหล่านี้ ระบบจะใช้รายการที่ใกล้เคียงที่สุด (โดยไม่เกิน) ความกว้างหน้าจอปัจจุบันของอุปกรณ์ ใกล้เคียงที่สุดจะพิจารณาจากการบวกความแตกต่าง ระหว่างความกว้างของหน้าจอจริงกับความกว้างที่ระบุเข้ากับความแตกต่างระหว่าง ความสูงของหน้าจอจริงกับความสูงที่ระบุ โดยความสูงและความกว้างที่ไม่ได้ระบุ จะมีค่าเป็น 0 ค่าดังกล่าวไม่รวมพื้นที่ที่ขอบหน้าต่างครอบครอง ดังนั้นหากอุปกรณ์มีองค์ประกอบ UI ที่คงอยู่บนขอบของจอแสดงผล ค่าความกว้างและความสูงจะเล็กกว่าขนาดหน้าจอจริง แม้ว่าแอปจะแสดงแบบขอบจรดขอบโดยใช้
การตกแต่งหน้าจอแนวตั้งบางอย่างที่ไม่ได้แก้ไข (เช่น แถบสถานะของโทรศัพท์ ซึ่งซ่อนได้เมื่อเต็มหน้าจอ) จะไม่รวมอยู่ในที่นี้ รวมถึงการตกแต่งหน้าต่าง เช่น แถบชื่อหรือแถบการดำเนินการ ดังนั้นแอปจึงต้องเตรียมพร้อมรับมือ กับพื้นที่ที่เล็กลงกว่าที่ระบุไว้ หมายเหตุ: ระบบจะเลือกแหล่งข้อมูลที่มีความกว้างและความสูงตรงกัน ดังนั้น เราจึงขอแนะนำให้ใช้แหล่งข้อมูลที่ระบุทั้ง 2 อย่างมากกว่าแหล่งข้อมูลที่ระบุอย่างใดอย่างหนึ่ง ตัวอย่างเช่น หากหน้าจอจริงมีความกว้าง 720 dp และสูง 1280 dp และทรัพยากรหนึ่งมีคุณสมบัติ w720dp และอีกทรัพยากรมีคุณสมบัติ w700dp-h1200dp ระบบจะเลือกทรัพยากรหลังแม้ว่าทรัพยากรแรกจะตรงกับสิ่งที่ระบุไว้ก็ตาม เพิ่มใน API ระดับ 13 ดูฟิลด์การกำหนดค่า ดูข้อมูลเพิ่มเติมเกี่ยวกับการออกแบบสำหรับหน้าจอต่างๆ โดยใช้ตัวระบุนี้ได้ที่ การออกแบบที่ตอบสนองตามอุปกรณ์/การออกแบบที่ปรับตามอุปกรณ์ด้วยมุมมอง |
| ขนาดหน้าจอ |
smallnormallargexlarge
|
หมายเหตุ: การใช้ตัวระบุขนาด ไม่ได้หมายความว่าทรัพยากรนั้นมีไว้สำหรับหน้าจอขนาดดังกล่าวเท่านั้น หากคุณไม่ได้ ระบุทรัพยากรทางเลือกที่มีตัวระบุที่ตรงกับการกำหนดค่าอุปกรณ์ปัจจุบันมากกว่า ระบบจะใช้ทรัพยากรที่ตรงกันมากที่สุด ข้อควรระวัง: หากทรัพยากรทั้งหมดใช้ตัวระบุขนาดที่ใหญ่กว่าหน้าจอปัจจุบัน ระบบจะไม่ใช้ทรัพยากรเหล่านั้นและแอปจะขัดข้องขณะรันไทม์ เช่น กรณีนี้จะเกิดขึ้นหากทรัพยากรเลย์เอาต์ทั้งหมด
ติดแท็กด้วยตัวระบุ เพิ่มใน API ระดับ 4 ดู ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ |
| สัดส่วนหน้าจอ |
longnotlong
|
เพิ่มใน API ระดับ 4 ซึ่งอิงตามสัดส่วนภาพของหน้าจอเท่านั้น (หน้าจอ ดูฟิลด์การกำหนดค่า |
| หน้าจอกลม |
roundnotround
|
เพิ่มใน API ระดับ 23 ดู |
| Wide Color Gamut |
widecgnowidecg
|
เพิ่มใน API ระดับ 26 ดู |
| High Dynamic Range (HDR) |
highdrlowdr
|
เพิ่มใน API ระดับ 26 ดู |
| การวางแนวหน้าจอ |
portland
|
ค่านี้อาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากผู้ใช้หมุน หน้าจอ ดูข้อมูลเกี่ยวกับผลกระทบต่อแอปของคุณในระหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า นอกจากนี้ ให้ดู |
| โหมด UI |
cardesktelevisionappliancewatchvrheadset
|
เพิ่มใน API ระดับ 8, เพิ่มโทรทัศน์ใน API ระดับ 13 และเพิ่มนาฬิกาใน API ระดับ 20 ดูข้อมูลเกี่ยวกับวิธีที่แอปตอบสนองเมื่อเสียบอุปกรณ์เข้ากับแท่นวางหรือนำออกจากแท่นวางได้ที่กำหนดและตรวจสอบสถานะและประเภทการเชื่อมต่อแท่นวาง ค่านี้อาจเปลี่ยนแปลงได้ตลอดอายุการใช้งานของแอปหากผู้ใช้วางอุปกรณ์ไว้ใน
แท่นวาง คุณเปิดหรือปิดใช้โหมดบางโหมดได้โดยใช้
|
| โหมดกลางคืน |
nightnotnight
|
เพิ่มใน API ระดับ 8 การตั้งค่านี้อาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากปล่อยให้โหมดกลางคืนอยู่ในโหมดอัตโนมัติ (ค่าเริ่มต้น) ในกรณีนี้ โหมดจะเปลี่ยนไปตามช่วงเวลาของวัน คุณเปิดหรือปิดใช้โหมดนี้ได้โดยใช้ |
| ความหนาแน่นของพิกเซลหน้าจอ (dpi) |
ldpimdpihdpixhdpixxhdpixxxhdpinodpitvdpianydpinnndpi
|
อัตราส่วนการปรับขนาดระหว่างความหนาแน่นหลัก 6 ระดับคือ 3:4:6:8:12:16 (ไม่รวมความหนาแน่น tvdpi) ดังนั้น บิตแมปขนาด 9x9 ใน ldpi จะเป็น 12x12 ใน mdpi, 18x18 ใน hdpi, 24x24 ใน xhdpi และอื่นๆ หมายเหตุ: การใช้ตัวระบุความหนาแน่นไม่ได้หมายความว่าทรัพยากรจะใช้ได้เฉพาะกับหน้าจอที่มีความหนาแน่นดังกล่าวเท่านั้น หากคุณไม่ได้ระบุทรัพยากรสำรอง ที่มีตัวระบุที่ตรงกับการกำหนดค่าอุปกรณ์ปัจจุบันมากกว่า ระบบจะใช้ทรัพยากรที่ตรงกันมากที่สุด ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการความหนาแน่นของหน้าจอที่แตกต่างกันและวิธีที่ Android อาจปรับขนาดบิตแมปให้พอดีกับความหนาแน่นปัจจุบันได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ |
| ประเภทหน้าจอสัมผัส |
notouchfinger
|
ดูฟิลด์การกำหนดค่า |
| ความพร้อมใช้งานของแป้นพิมพ์ |
keysexposedkeyshiddenkeyssoft
|
หากคุณระบุ ค่านี้อาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอปหากผู้ใช้เปิดแป้นพิมพ์ฮาร์ดแวร์ ดูข้อมูลเกี่ยวกับผลกระทบต่อแอปของคุณในระหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า ดูฟิลด์การกำหนดค่า |
| วิธีการป้อนข้อความหลัก |
nokeysqwerty12key
|
ดู |
| ความพร้อมใช้งานของปุ่มนำทาง |
navexposednavhidden
|
ค่านี้อาจเปลี่ยนแปลงได้ในระหว่างอายุการใช้งานของแอป หากผู้ใช้แสดงคีย์การนำทาง ดูข้อมูลเกี่ยวกับผลกระทบต่อแอปของคุณในระหว่างรันไทม์ได้ที่ จัดการการเปลี่ยนแปลงการกำหนดค่า ดู |
| วิธีการนำทางหลักที่ไม่ใช่การสัมผัส |
nonavdpadtrackballwheel
|
ดู |
| เวอร์ชันของแพลตฟอร์ม (ระดับ API) | ตัวอย่างv3v4v7ฯลฯ |
ระดับ API ที่อุปกรณ์รองรับ เช่น |
หมายเหตุ: 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 จะเป็นที่ที่ระบุรหัสทรัพยากร แต่คุณไม่จำเป็นต้องค้นหารหัสทรัพยากรในคลาสนี้ รหัสทรัพยากรประกอบด้วยข้อมูลต่อไปนี้เสมอ
- ประเภททรัพยากร: ทรัพยากรแต่ละรายการจะจัดกลุ่มเป็น "ประเภท" เช่น
stringdrawableและ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 ค้นหา ทรัพยากรที่ตรงกันมากที่สุด
- นำไฟล์ทรัพยากรที่ขัดแย้งกับการกำหนดค่าอุปกรณ์ออก
ระบบจะนำไดเรกทอรี
drawable-fr-rCA/ออกเนื่องจากขัดแย้งกับภาษาen-GBdrawable/ drawable-en/
drawable-fr-rCA/drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/ข้อยกเว้น: ความหนาแน่นของพิกเซลหน้าจอเป็นคุณสมบัติเดียวที่ไม่ได้ ถูกนำออกเนื่องจากความขัดแย้ง แม้ว่าความหนาแน่นของหน้าจอของอุปกรณ์จะเป็น hdpi แต่ระบบจะไม่นำ
drawable-port-ldpi/ออกเนื่องจากความหนาแน่นของหน้าจอทุกระดับถือว่าตรงกันในตอนนี้ ดูข้อมูลได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ - ค้นหาตัวระบุที่มีลำดับความสำคัญสูงสุดถัดไปในรายการ (ตารางที่ 2) (เริ่มต้นด้วย MCC)
- ไดเรกทอรีทรัพยากรมีตัวระบุนี้ไหม
- หากไม่มี ให้กลับไปที่ขั้นตอนที่ 2 แล้วดูผู้มีสิทธิ์รายถัดไป ในตัวอย่างนี้ คำตอบคือ "ไม่" จนกว่าจะถึงตัวระบุภาษา
- หากใช่ ให้ไปที่ขั้นตอนที่ 4
- นำไดเรกทอรีทรัพยากรที่ไม่มีตัวระบุนี้ออก ในตัวอย่างนี้ ระบบ
จะนำไดเรกทอรีทั้งหมดที่ไม่มีตัวระบุภาษาออก
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/ข้อยกเว้น: หากตัวระบุที่เป็นปัญหาคือความหนาแน่นพิกเซลของหน้าจอ Android จะเลือกตัวเลือกที่ตรงกับความหนาแน่นของหน้าจออุปกรณ์มากที่สุด โดยทั่วไปแล้ว Android จะชอบการลดขนาดรูปภาพต้นฉบับที่ใหญ่กว่ามากกว่าการขยายขนาดรูปภาพต้นฉบับที่เล็กกว่า ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมความเข้ากันได้ของหน้าจอ
- ทำขั้นตอนที่ 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 จึงถูกตัดออก