Yanıtlar:
Kaynaklarla, burada açıklandığı gibi farklı diller, işletim sistemi sürümleri, ekran yönleri vb. İçin alternatifler sağlamak için yerleşik destek vardır . Bunların hiçbiri varlıklarla kullanılamaz. Ayrıca, API'nın birçok bölümü kaynak tanımlayıcılarının kullanımını destekler. Son olarak, kaynakların adları derleme zamanında denetlenen sabit alan adlarına dönüştürülür, bu nedenle kod ve kaynakların kendileri arasında uyumsuzluklar için daha az fırsat vardır. Bunların hiçbiri varlıklar için geçerli değildir.
Öyleyse neden bir varlık klasörü var? Kullanmak istediğiniz varlığı çalışma zamanında hesaplamak istiyorsanız, oldukça kolaydır. Kaynaklarla, kullanılabilecek tüm kaynak kimliklerinin bir listesini bildirmeniz ve listeye bir dizin hesaplamanız gerekir. (Bu bir tür gariptir ve kaynak kümesi geliştirme döngüsünde değişirse hata fırsatları ortaya çıkarır.) (EDIT: kullanarak bir kaynak kimliğini adıyla alabilirsiniz getIdentifier
, ancak bu derleme zamanı denetiminin avantajlarını kaybeder.) Varlıklar ayrıca kaynaklar tarafından desteklenmeyen bir klasör hiyerarşisi olarak da organize edilebilir. Bu, verileri yönetmenin farklı bir yoludur. Kaynaklar vakaların çoğunu kapsamasına rağmen, varlıkların arada sırada kullanımı vardır.
Diğer bir fark: kütüphane projesinde tanımlanan kaynaklar otomatik olarak kütüphaneye bağlı uygulama projelerine aktarılır. Varlıklar için bu olmaz; varlık dosyaları, uygulama projelerinin varlık dizininde bulunmalıdır. [DÜZENLEME: Android'in yeni Gradle tabanlı oluşturma sistemi (Android Studio ile kullanılır) artık bu doğru değildir. Kütüphane projeleri için varlık dizinleri .aar dosyalarına paketlenir, bu nedenle kütüphane projelerinde tanımlanan varlıklar uygulama projelerine birleştirilir (bu nedenle /assets
başvurulan bir kütüphanedeyse uygulamanın dizininde bulunması gerekmez ).]
EDIT: Uygulamanızla özel bir yazı tipi paketlemek istiyorsanız başka bir fark ortaya çıkar. Dosya sisteminde veya uygulamanızın dizininde depolanan bir font dosyasından bir oluşturmak için API çağrıları vardır . Ancak dizinde depolanan bir font dosyasından (veya dizinin kullanılmasına izin verecek bir a'dan) oluşturmak için API yoktur . [ NOT: Android O ile (artık alfa önizlemesinde kullanılabilir) özel yazı tiplerini kaynak olarak dahil edebileceksiniz. Açıklamasına bakın burada bu uzun gecikmiş özelliği. Bununla birlikte, minimum API düzeyiniz 25 veya daha az olduğu sürece, özel yazı tiplerini kaynak yerine varlık olarak paketlemeniz gerekir.]Typeface
assets/
Typeface
res/
InputStream
res/
raw/
Dizindeki dosyalara yazmak mümkün müdür?
/res
dosyasında paketlendikleri için ve / / asset dizinlerindeki her şey salt okunurdur.
Her ikisi de oldukça benzer. İkisi arasındaki gerçek ana fark, res
dizinde her dosyaya ID
kolayca erişilebilen bir ön derleme verilmesi R.id.[res id]
. Bu, görüntülere, seslere, simgelere hızlı ve kolay bir şekilde erişmek için kullanışlıdır ...
assets
Dizin daha bir dosya sistemi gibi ve orada istediğiniz herhangi bir dosyayı koymak için daha fazla özgürlük sağlar. Daha sonra, Java aracılığıyla herhangi bir dosya sistemindeki herhangi bir dosyaya erişirken o sistemdeki her dosyaya erişebilirsiniz. Bu dizin oyun detayları, sözlükler, vb. Şeyler için iyidir. Umarım yardımcı olur.
Assets
klasöre koymak zorunda değiliz , Android sistemi şimdi fonts
dizin içeriyor ve özel yazı tipleri dosyamızı buraya koyabiliriz veya Android stüdyosunun bizim için indirmesini sağlayabiliriz.
Bunun eski olduğunu biliyorum, ama sadece netleştirmek için, resmi android belgelerinde her birinin bir açıklaması var:
dan http://developer.android.com/tools/projects/index.html
assets/
Bu boş. Ham varlık dosyalarını saklamak için kullanabilirsiniz. Buraya kaydettiğiniz dosyalar olduğu gibi bir .apk dosyasında derlenir ve özgün dosya adı korunur. Bu dizinde URI'leri kullanarak tipik bir dosya sistemiyle aynı şekilde gezinebilir ve AssetManager'ı kullanarak dosyaları bayt akışı olarak okuyabilirsiniz. Örneğin, burası dokular ve oyun verileri için iyi bir yerdir.
res/raw/
Rasgele ham varlık dosyaları için. Varlık dosyalarını varlık / dizin yerine buraya kaydetmek, yalnızca bunlara erişme şeklinize göre değişir. Bu dosyalar aapt tarafından işlenir ve R sınıfındaki bir kaynak tanımlayıcı kullanılarak uygulamadan başvurulması gerekir. Örneğin, MP3 veya Ogg dosyaları gibi ortamlar için iyi bir yerdir.
Aşağıda bazı önemli noktalar verilmiştir:
Sonuç
Bunları Java Kodunda bir yere göndermeniz gerekiyorsa, dosyalarınızı "res" dizinine sokarsınız.
Ve res klasöründeki tüm dosyalar R dosyasında indekslenir, bu da onları yüklemeyi çok daha hızlı (ve çok daha kolay!) Yapar.
Ted Hopp bunu oldukça güzel yanıtladı. Ben opengl doku ve gölgelendirici dosyaları için res / raw kullanıyorum. Hiyerarşik bir organizasyon sağlamak için onları bir varlıklar dizinine taşımayı düşünüyordum.
Bu konu beni yapmamaya ikna etti. İlk olarak, benzersiz bir kaynak kimliği kullanımını seviyorum çünkü. İkincisi, dosyada okumak için InputStream / openRawResource veya BitmapFactory'yi kullanmak çok basit. Üçüncüsü, taşınabilir bir kütüphanede kullanabilmek çok faydalıdır.
Varlıklar, uygulamanıza metin, xml, yazı tipleri, müzik ve video gibi rastgele dosyalar eklemenin bir yolunu sunar. Bu dosyaları "kaynak" olarak eklemeye çalışırsanız, Android bunları kaynak sistemine işleyecek ve ham verileri alamayacaksınız. El değmemiş verilere erişmek istiyorsanız, Varlıklar bunu yapmanın bir yoludur.
res/raw
, kullanarak ham verilere ulaşabilirsiniz openRawResource(resourceName)
.
res
kaynakları temsil eder, o zaman ne anlamaassets
gelir?