ฉันรู้ว่าไฟล์ในres
ไดเรกทอรีสามารถเข้าถึงได้จากR.class
ในขณะที่สินทรัพย์ทำงานเหมือนระบบไฟล์ แต่ฉันต้องการทราบโดยทั่วไปว่าเมื่อใดควรใช้อย่างใดอย่างหนึ่ง
ใครสามารถช่วยฉันในการรู้ความแตกต่างที่แท้จริงระหว่างความละเอียดและสินทรัพย์
ฉันรู้ว่าไฟล์ในres
ไดเรกทอรีสามารถเข้าถึงได้จากR.class
ในขณะที่สินทรัพย์ทำงานเหมือนระบบไฟล์ แต่ฉันต้องการทราบโดยทั่วไปว่าเมื่อใดควรใช้อย่างใดอย่างหนึ่ง
ใครสามารถช่วยฉันในการรู้ความแตกต่างที่แท้จริงระหว่างความละเอียดและสินทรัพย์
คำตอบ:
ด้วยทรัพยากรมีการสนับสนุนในตัวสำหรับการให้ทางเลือกสำหรับภาษาต่าง ๆ เวอร์ชันของระบบปฏิบัติการการวางแนวหน้าจอ ฯลฯ ตามที่อธิบายไว้ที่นี่ที่นี่ไม่มีสิ่งใดที่พร้อมใช้งานกับเนื้อหา นอกจากนี้หลายส่วนของ API ยังสนับสนุนการใช้ตัวระบุทรัพยากร ในที่สุดชื่อของทรัพยากรจะถูกเปลี่ยนเป็นชื่อเขตข้อมูลคงที่ที่มีการตรวจสอบในเวลารวบรวมดังนั้นจึงมีโอกาสน้อยกว่าที่จะไม่ตรงกันระหว่างรหัสและทรัพยากรด้วยตนเอง ไม่มีสิ่งใดที่เกี่ยวข้องกับสินทรัพย์
เหตุใดจึงต้องมีโฟลเดอร์สินทรัพย์เลย หากคุณต้องการคำนวณสินทรัพย์ที่คุณต้องการใช้ในขณะใช้งานมันค่อนข้างง่าย ด้วยทรัพยากรคุณจะต้องประกาศรายการของรหัสทรัพยากรทั้งหมดที่อาจใช้และคำนวณดัชนีลงในรายการ (นี่เป็นชนิดที่น่าอึดอัดใจและแนะนำโอกาสในการเกิดข้อผิดพลาดหากชุดของการเปลี่ยนแปลงทรัพยากรในวงจรการพัฒนา) (แก้ไข: คุณสามารถเรียก ID ทรัพยากรตามชื่อโดยใช้getIdentifier
แต่สิ่งนี้จะเสียประโยชน์จากการตรวจสอบเวลาคอมไพล์) ยังถูกจัดระเบียบเป็นลำดับชั้นของโฟลเดอร์ซึ่งไม่ได้รับการสนับสนุนจากทรัพยากร มันเป็นวิธีการจัดการข้อมูลที่แตกต่าง แม้ว่าทรัพยากรครอบคลุมกรณีส่วนใหญ่ แต่สินทรัพย์มีการใช้งานเป็นครั้งคราว
ความแตกต่างอีกประการหนึ่ง: ทรัพยากรที่กำหนดไว้ในโครงการห้องสมุดจะถูกนำเข้าโดยอัตโนมัติไปยังโครงการแอปพลิเคชันที่ขึ้นอยู่กับห้องสมุด สำหรับสินทรัพย์นั่นไม่ได้เกิดขึ้น ไฟล์สินทรัพย์ต้องมีอยู่ในไดเรกทอรีสินทรัพย์ของโครงการแอปพลิเคชัน [แก้ไข: ด้วยระบบการสร้างแบบ Gradle-basedใหม่ของ Android (ใช้กับ Android Studio) สิ่งนี้ไม่เป็นความจริงอีกต่อไป ไดเรกทอรีสินทรัพย์สำหรับโครงการห้องสมุดถูกรวมไว้ในไฟล์. aar ดังนั้นสินทรัพย์ที่กำหนดไว้ในโครงการห้องสมุดจะรวมเข้ากับโครงการแอปพลิเคชัน (ดังนั้นจึงไม่จำเป็นต้องมีอยู่ใน/assets
ไดเรกทอรีของแอปพลิเคชัน
แก้ไข: มีความแตกต่างอื่นเกิดขึ้นถ้าคุณต้องการจัดทำฟอนต์แบบกำหนดเองด้วยแอปของคุณ มีการเรียก APIเพื่อสร้างTypeface
จากไฟล์ฟอนต์ที่เก็บไว้ในระบบไฟล์หรือในassets/
ไดเรกทอรีของแอปของคุณ แต่ไม่มี API ที่จะสร้างTypeface
จากไฟล์ฟอนต์ที่เก็บไว้ในres/
ไดเรกทอรี (หรือจากInputStream
ซึ่งจะอนุญาตให้ใช้res/
ไดเรกทอรี) [ หมายเหตุ:ด้วย Android O (ตอนนี้พร้อมใช้งานในหน้าตัวอย่างแบบอัลฟา) คุณจะสามารถรวมแบบอักษรที่กำหนดเองเป็นทรัพยากรได้ ดูคำอธิบายที่นี่ของคุณลักษณะที่ค้างชำระนาน อย่างไรก็ตามตราบใดที่ระดับ API ต่ำสุดของคุณคือ 25 หรือน้อยกว่าคุณจะต้องติดกับแบบอักษรที่กำหนดเองของบรรจุภัณฑ์เป็นสินทรัพย์แทนที่จะเป็นทรัพยากร]
raw/
ไดเรกทอรี?
/res
ไดเรกทอรีและ '/ assets' นั้นเป็นแบบอ่านอย่างเดียวเนื่องจากถูกทำแพ็กเกจไว้ในไฟล์. apk
ทั้งคู่คล้ายกันมาก ความแตกต่างสำคัญที่แท้จริงระหว่างคนทั้งสองที่อยู่ในres
ไดเรกทอรีแต่ละไฟล์จะได้รับก่อนรวบรวมซึ่งสามารถเข้าถึงได้อย่างง่ายดายผ่านทางID
R.id.[res id]
สิ่งนี้มีประโยชน์ในการเข้าถึงรูปภาพเสียงไอคอนอย่างรวดเร็วและง่ายดาย
assets
ไดเรกทอรีมีมากขึ้นเช่นระบบแฟ้มและให้เสรีภาพมากขึ้นที่จะนำไฟล์ที่คุณต้องการในการมี จากนั้นคุณสามารถเข้าถึงแต่ละไฟล์ในระบบนั้นได้เช่นเดียวกับเมื่อคุณเข้าถึงไฟล์ใด ๆ ในระบบไฟล์ผ่าน Java ไดเรกทอรีนี้เหมาะสำหรับสิ่งต่าง ๆ เช่นรายละเอียดเกมพจนานุกรม ... ฯลฯ หวังว่าจะช่วย
Assets
โฟลเดอร์ระบบ Android ตอนนี้มีfonts
ไดเรกทอรีและเราสามารถใส่ไฟล์แบบอักษรที่กำหนดเองของเราที่นั่นหรือเราสามารถดาวน์โหลด Android studio สำหรับเรา
ฉันรู้ว่ามันเก่า แต่เพียงเพื่อให้ชัดเจนมีคำอธิบายของแต่ละคนในเอกสาร Android อย่างเป็นทางการ:
จากhttp://developer.android.com/tools/projects/index.html
assets/
นี่ว่างเปล่า คุณสามารถใช้มันเพื่อจัดเก็บไฟล์สินทรัพย์ดิบ ไฟล์ที่คุณบันทึกที่นี่จะถูกรวบรวมเป็นไฟล์. apk ตามที่เป็นอยู่และชื่อไฟล์ดั้งเดิมจะถูกเก็บรักษาไว้ คุณสามารถนำทางไดเรกทอรีนี้ในลักษณะเดียวกับระบบไฟล์ทั่วไปโดยใช้ URIs และอ่านไฟล์เป็นสตรีมไบต์โดยใช้ AssetManager ตัวอย่างเช่นนี่เป็นตำแหน่งที่ดีสำหรับพื้นผิวและข้อมูลเกม
res/raw/
สำหรับไฟล์สินทรัพย์ดิบโดยพลการ การบันทึกไฟล์เนื้อหาที่นี่แทนที่จะเป็นในไฟล์สินทรัพย์ / ไดเรกทอรีจะแตกต่างกันไปตามวิธีที่คุณเข้าถึง ไฟล์เหล่านี้ถูกประมวลผลโดย aapt และต้องอ้างอิงจากแอปพลิเคชันโดยใช้ตัวระบุทรัพยากรในคลาส R ตัวอย่างเช่นนี่เป็นสถานที่ที่ดีสำหรับสื่อเช่นไฟล์ MP3 หรือ Ogg
ต่อไปนี้เป็นประเด็นสำคัญ:
ข้อสรุป
หากคุณต้องการอ้างอิงไฟล์เหล่านี้ใน Java Code คุณจะต้องใส่ไฟล์ของคุณลงในไดเรกทอรี "res"
และไฟล์ทั้งหมดในโฟลเดอร์ res จะถูกทำดัชนีในไฟล์ R ซึ่งทำให้โหลดได้เร็วขึ้น (และง่ายกว่ามาก!)
ใช้ทรัพย์สินอย่างระบบไฟล์เพื่อถ่ายโอนไฟล์ทุกชนิด และใช้ res เพื่อจัดเก็บสิ่งที่ทำไว้สำหรับเลย์เอาต์รูปภาพค่า
Ted Hopp ตอบคำถามนี้ค่อนข้างดี ฉันใช้ res / raw สำหรับไฟล์ opengl texture และ shader ฉันกำลังคิดที่จะย้ายพวกเขาไปยังไดเรกทอรีสินทรัพย์เพื่อให้องค์กรที่มีลำดับชั้น
หัวข้อนี้ทำให้ฉันไม่เชื่อ ก่อนอื่นเพราะฉันชอบใช้รหัสทรัพยากรที่ไม่ซ้ำใคร ข้อสองเพราะมันง่ายมากที่จะใช้ InputStream / openRawResource หรือ BitmapFactory เพื่ออ่านในไฟล์ ข้อที่สามเพราะมีประโยชน์มากที่จะสามารถใช้ในห้องสมุดแบบพกพา
เนื้อหามีวิธีการรวมไฟล์โดยพลการเช่นข้อความ, xml, ฟอนต์, เพลงและวิดีโอในแอปพลิเคชันของคุณ หากคุณพยายามรวมไฟล์เหล่านี้เป็น "ทรัพยากร" Android จะประมวลผลไฟล์เหล่านั้นลงในระบบทรัพยากรและคุณจะไม่สามารถรับข้อมูลดิบได้ หากคุณต้องการเข้าถึงข้อมูลที่ไม่ถูกแตะต้องสินทรัพย์เป็นวิธีหนึ่งในการดำเนินการ
res/raw
, openRawResource(resourceName)
คุณจะได้รับข้อมูลดิบโดยใช้
res
ย่อมาจากทรัพยากรแล้วสิ่งที่จะassets
หมายถึงอะไร