Kaynaklar, kodunuzun kullandığı ek dosyalar ve statik içeriklerdir (ör. bit eşlemler, kullanıcı arayüzü dizeleri, animasyon talimatları).
Resimler ve dizeler gibi uygulama kaynaklarını her zaman kodunuzdan bağımsız olarak tutun. Böylece bunları ayrı ayrı koruyabilirsiniz. Ayrıca, belirli cihaz yapılandırmaları için alternatif kaynaklar sağlayın. Bunun için kaynakları özel olarak adlandırılmış kaynak dizinlerinde gruplandırın. Android, çalışma zamanında mevcut yapılandırmaya göre uygun kaynağı kullanır. Örneğin, dil ayarına bağlı olarak farklı dizeler sağlamak isteyebilirsiniz.
Uygulama kaynaklarınızı haricileştirdikten sonra, projenizin R sınıfında oluşturulan kaynak kimliklerini kullanarak bunlara erişebilirsiniz.
Bu belgede, Android projenizdeki kaynakları nasıl gruplandıracağınız gösterilmektedir. Ayrıca, belirli cihaz yapılandırmaları için alternatif kaynakları nasıl sağlayacağınızı ve ardından uygulama kodunuzdan veya diğer XML dosyalarından bunlara nasıl erişeceğinizi de gösterir.
Grup kaynak türleri
Her kaynak türünü projenizin res/ dizininin belirli bir alt dizinine yerleştirin. Örneğin, basit bir projenin dosya hiyerarşisi aşağıda verilmiştir:
MyProject/
src/
MyActivity.kt
res/
drawable/
graphic.png
mipmap/
icon.png
values/
strings.xml
res/ dizini, alt dizinlerindeki tüm kaynakları içerir: bir resim kaynağı, başlatıcı simgeleri için bir mipmap/ dizini ve bir dize kaynak dosyası. Kaynak dizini adları önemlidir ve Tablo 1'de açıklanmıştır.
Not: Mipmap klasörlerini kullanma hakkında daha fazla bilgi için Uygulama simgelerini mipmap dizinlerine yerleştirme başlıklı makaleyi inceleyin.
Tablo 1. Proje res/ dizininde desteklenen kaynak dizinleri.
| Dizin | Kaynak Türü |
|---|---|
drawable/ |
Aşağıdaki drawable kaynak alt türlerine derlenen bit eşlem dosyaları (PNG,
Daha fazla bilgi için Çizilebilir kaynaklar başlıklı makaleyi inceleyin. |
mipmap/ |
Farklı başlatıcı simgesi yoğunlukları için çizilebilir dosyalar. mipmap/ klasörleriyle başlatıcı simgelerini yönetme hakkında daha fazla bilgi için Uygulama simgelerini mipmap dizinlerine yerleştirme başlıklı makaleyi inceleyin. |
raw/ |
Ham biçiminde kaydedilecek rastgele dosyalar. Bu kaynakları ham Ancak orijinal dosya adlarına ve dosya hiyerarşisine erişmeniz gerekiyorsa kaynakları |
values/ |
Dizeler, tam sayılar ve renkler gibi basit değerler içeren XML dosyaları. Diğer Her kaynak kendi XML öğesiyle tanımlandığından dosyayı istediğiniz gibi adlandırabilir ve farklı kaynak türlerini tek bir dosyaya yerleştirebilirsiniz. Ancak daha net olması için benzersiz kaynak türlerini farklı dosyalara yerleştirebilirsiniz. Örneğin, bu dizinde oluşturabileceğiniz kaynaklar için bazı dosya adı kuralları şunlardır:
Daha fazla bilgi için Dize kaynakları, Stil kaynağı ve Diğer kaynak türleri başlıklı makaleleri inceleyin. |
xml/ |
Çalışma zamanında Resources.getXML çağrılarak okunabilen rastgele XML dosyaları. Çeşitli XML yapılandırma dosyaları buraya kaydedilmelidir.
|
font/ |
TTF, OTF veya TTC gibi uzantılara sahip yazı tipi dosyaları ya da <font-family> öğesi içeren XML dosyaları. Kaynak olarak kullanılan yazı tipleri hakkında daha fazla bilgi için Yazı tipini XML kaynağı olarak ekleme başlıklı makaleyi inceleyin.
|
Dikkat: Kaynak dosyalarını asla doğrudan res/ dizinine kaydetmeyin. Derleyici hatasına neden olur.
Tablo 1'de tanımlanan alt dizinlere kaydettiğiniz kaynaklar, varsayılan kaynaklarınızdır. Yani bu kaynaklar, uygulamanızın varsayılan tasarımını ve içeriğini tanımlar. Ancak, farklı türlerdeki Android destekli cihazlar farklı türlerde kaynaklar gerektirebilir.
Örneğin, cihazın dil ayarına göre kullanıcı arayüzünüzdeki metni çeviren farklı dize kaynakları sağlayabilirsiniz.
Not: Compose'da kullanıcı arayüzleri, animasyonlar ve duruma dayalı renkler Kotlin'de tanımlanır. Bu nedenle layout/, menu/, anim/, animator/ ve color/ dizinleri modern uygulamalar için kullanılmaz. Daha fazla bilgi için Compose'da animasyonlar ve Compose'da temanın yapısı başlıklı makaleleri inceleyin.
Alternatif kaynaklar sağlama
Çoğu uygulama, belirli cihaz yapılandırmalarını desteklemek için alternatif kaynaklar sağlar. Örneğin, farklı ekran yoğunlukları için alternatif çizilebilir kaynaklar ve farklı diller için alternatif dize kaynakları ekleyin. Android, çalışma zamanında mevcut cihaz yapılandırmasını algılar ve uygulamanız için uygun kaynakları yükler.
Bir dizi kaynak için yapılandırmaya özel alternatifler belirtmek üzere aşağıdakileri yapın:
res/içinde<resources_name>-<qualifier>biçiminde adlandırılmış yeni bir dizin oluşturun.<resources_name>, ilgili varsayılan kaynakların (Tablo 1'de tanımlanmıştır) dizin adıdır.<qualifier>, bu kaynakların kullanılacağı bireysel bir yapılandırmayı belirten bir addır (Tablo 2'de tanımlanmıştır).
Birden fazla
<qualifier>ekleyebilirsiniz. Her birini tireyle ayırın.Dikkat: Birden fazla niteleyici eklerken bunları Tablo 2'de listelendikleri sırayla yerleştirmeniz gerekir. Niteleyiciler yanlış sıralanırsa kaynaklar yoksayılır.
- Bu yeni dizine uygun alternatif kaynakları kaydedin. Kaynak dosyaları, varsayılan kaynak dosyalarıyla aynı şekilde adlandırılmalıdır.
Örneğin, bazı varsayılan ve alternatif kaynaklar aşağıda verilmiştir:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
hdpi niteleyicisi, söz konusu dizindeki kaynakların yüksek yoğunluklu ekrana sahip cihazlar için olduğunu gösterir. Bu drawable dizinlerindeki resimler belirli ekran yoğunlukları için boyutlandırılır ancak dosya adları tamamen aynıdır. Bu sayede, icon.png veya background.png resmine referans vermek için kullandığınız kaynak kimliği her zaman aynı olur. Android, cihaz yapılandırma bilgilerini kaynak dizin adındaki niteleyicilerle karşılaştırarak her kaynağın mevcut cihaza en uygun sürümünü seçer.
Dikkat: Alternatif bir kaynak tanımlarken kaynağı varsayılan bir yapılandırmada da tanımladığınızdan emin olun. Aksi takdirde, cihaz bir yapılandırmayı değiştirdiğinde uygulamanızda çalışma zamanı istisnaları oluşabilir. Örneğin, yalnızca values-en öğesine bir dize ekleyip values öğesine eklemezseniz kullanıcı varsayılan sistem dilini değiştirdiğinde uygulamanız Resource Not Found istisnasıyla karşılaşabilir.
Tablo 2'de yapılandırma niteleyicileri öncelik sırasına göre listelenmektedir. Her niteleyiciyi tireyle ayırarak tek bir dizin adına birden fazla niteleyici ekleyebilirsiniz. Bir kaynak dizini için birden fazla niteleyici kullanıyorsanız bunları tabloda listelendikleri sırayla dizin adına eklemeniz gerekir.
Tablo 2. Yapılandırma niteleyici adları.
| Yapılandırma | Niteleyici değerleri | Açıklama |
|---|---|---|
| MCC ve MNC | Örnekler:mcc310mcc208-mnc00
|
Mobil ülke kodu (MCC), isteğe bağlı olarak cihazdaki SIM kartın mobil ağ kodu (MNC) ile birlikte. Örneğin, Cihaz radyo bağlantısı kullanıyorsa (yani GSM telefonsa) MCC ve MNC değerleri SIM karttan alınır. Örneğin, ülkeye özgü yasal kaynakları uygulamanıza dahil etmek için de tek başına MCC'yi kullanabilirsiniz. Yalnızca dile göre belirtmeniz gerekiyorsa bunun yerine dil, alfabe (isteğe bağlı) ve bölge (isteğe bağlı) niteleyicisini kullanın. MM ve MNC niteleyicisini kullanıyorsanız dikkatli bir şekilde kullanın ve beklendiği gibi çalıştığını test edin. Ayrıca, sırasıyla mevcut mobil ülke kodunu ve mobil ağ kodunu gösteren yapılandırma alanları |
| Dil, yazı sistemi (isteğe bağlı) ve bölge (isteğe bağlı) | Örnekler:enfren-rUSfr-rFRfr-rCAb+enb+en+USb+es+419b+zh+Hantb+sr+Latn+RS |
Dil, iki harfli ISO 639-1 dil koduyla tanımlanır. İsteğe bağlı olarak, iki harfli ISO 3166-1-alpha-2 bölge kodu (küçük harfli Kodlar büyük/küçük harfe duyarlı değildir. Bölge kısmını ayırt etmek için Android 7.0 (API düzeyi 24), dil ve bölgeye özel kaynakları nitelendirmek için kullanabileceğiniz BCP 47 dil etiketleri desteğini kullanıma sundu. Dil etiketi, her biri genel etiket tarafından tanımlanan dil aralığını daraltan veya hassaslaştıran bir veya daha fazla alt etiketin sırasından oluşur. Dil etiketleri hakkında daha fazla bilgi için Dilleri Tanımlama Etiketleri başlıklı makaleyi inceleyin. BCP 47 dil etiketi kullanmak için Kullanıcılar sistem ayarlarında dili değiştirirse dil etiketi, uygulamanızın kullanım ömrü boyunca değişebilir. Bunun çalışma zamanında uygulamanızı nasıl etkileyebileceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme başlıklı makaleyi inceleyin. Uygulamanızı diğer diller için yerelleştirme hakkında eksiksiz bir rehber için Uygulamanızı yerelleştirme başlıklı makaleyi inceleyin. Ayrıca, tanımlanmış yerel ayarlar listesini sağlayan |
| Dil bilgisine uygun cinsiyet | masculinefeminineneuter |
Kullanıcının dil bilgisine uygun cinsiyeti. Dil bilgisine uygun cinsiyet içeren dillerde kullanılır. Örneğin, Fransızca konuşan kullanıcılara farklı kaynaklar sağlamanız gerekiyorsa aşağıdaki gibi dizinleri kullanabilirsiniz:
Uygulamanızın kullanıcı arayüzünü dilbilgisel cinsiyete göre kişiselleştirme başlıklı makaleyi inceleyin. Dilbilgisel cinsiyeti belirten API düzeyi 34'te eklendi. |
| Wide Color Gamut |
widecgnowidecg
|
API düzeyi 26'da eklendi. Ayrıca, ekranın geniş renk gamına sahip olup olmadığını gösteren |
| Yüksek Dinamik Aralık (HDR) |
highdrlowdr
|
API düzeyi 26'da eklendi. Ekranın HDR özelliklerine sahip olup olmadığını belirten |
| Kullanıcı arayüzü modu |
cardesktelevisionappliancewatchvrheadset
|
API düzeyi 8'de eklendi; televizyon API 13'te, cihaz API 16'da, kol saati API 20'de, VR başlığı API 26'da eklendi. Cihaz bir yuvaya takıldığında veya yuvadan çıkarıldığında uygulamanızın nasıl yanıt verebileceği hakkında bilgi edinmek için Yerleştirme durumunu ve türünü belirleme ve izleme başlıklı makaleyi inceleyin. Kullanıcı cihazı yerleştirme istasyonuna koyarsa bu durum uygulamanızın kullanım süresi boyunca değişebilir. Bu modlardan bazılarını |
| Gece modu |
nightnotnight
|
API düzeyi 8'de eklendi. Gece modu otomatik modda (varsayılan) bırakılırsa bu durum uygulamanızın kullanım süresi boyunca değişebilir. Bu durumda mod, günün saatine göre değişir. Bu modu |
| Ekran piksel yoğunluğu (dpi) |
ldpimdpihdpixhdpixxhdpixxxhdpinodpitvdpianydpinnndpi
|
Altı temel yoğunluk arasında 3:4:6:8:12:16 ölçeklendirme oranı vardır (tvdpi yoğunluğu hariç). Bu nedenle, ldpi'deki 9x9 boyutlu bir bitmap, mdpi'de 12x12, hdpi'de 18x18, xhdpi'da 24x24 boyutundadır. Not: Yoğunluk niteleyicisi kullanmak, kaynakların yalnızca bu yoğunluktaki ekranlar için olduğu anlamına gelmez. Mevcut cihaz yapılandırmasına daha iyi uyan niteleyicilerle alternatif kaynaklar sağlamazsanız sistem, en iyi eşleşen kaynakları kullanır. Farklı ekran yoğunluklarının nasıl işleneceği ve Android'in, mevcut yoğunluğa uyacak şekilde bit eşlemlerinizi nasıl ölçekleyebileceği hakkında daha fazla bilgi için Ekran uyumluluğuna genel bakış bölümüne bakın. |
| Dokunmatik ekran türü |
notouchfinger
|
Cihazdaki dokunmatik ekranın türünü belirten |
| Klavye kullanılabilirliği |
keysexposedkeyshiddenkeyssoft
|
Kullanıcı bir donanım klavyesi açarsa bu durum uygulamanızın kullanım ömrü boyunca değişebilir. Bu durumun uygulamanızı çalışma zamanında nasıl etkileyeceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme başlıklı makaleyi inceleyin. Ayrıca, sırasıyla bir donanım klavyesinin ve her türlü klavyenin (yazılım dahil) görünürlüğünü belirten yapılandırma alanları |
| Birincil metin giriş yöntemi |
nokeysqwerty12key
|
Ayrıca, kullanılabilen birincil metin giriş yöntemini gösteren |
| Gezinme tuşunun kullanılabilirliği |
navexposednavhidden
|
Kullanıcı gezinme tuşlarını gösterirse bu durum uygulamanızın kullanım ömrü boyunca değişebilir. Bu durumun uygulamanızı çalışma zamanında nasıl etkileyeceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme başlıklı makaleyi inceleyin. Ayrıca, gezinme tuşlarının gizlenip gizlenmediğini belirten |
| Birincil dokunmatik olmayan gezinme yöntemi |
nonavdpadtrackballwheel
|
Ayrıca, kullanılabilen navigasyon yönteminin türünü belirten |
| Platform sürümü (API düzeyi) | Örnekler:v3v4v7vb. |
Cihazın desteklediği API düzeyi. Örneğin, |
Not: Android'in tüm sürümleri, tüm niteleyicileri desteklemez. Yeni bir niteleyici kullanmak, eski cihazların yoksayabilmesi için platform sürümü niteleyicisini dolaylı olarak ekler. Sorun yaşamamak için her zaman bir dizi varsayılan kaynak (nitelik içermeyen bir kaynak grubu) ekleyin. Daha fazla bilgi için kaynaklarla en iyi cihaz uyumluluğunu sağlama bölümüne bakın.
Compose uygulamalarında, düzen ve boyutla ilgili yapılandırma niteleyicileri gerekmez. Bu cihazlar hala mevcut olsa da Tablo 2'ye dahil edilmez. Bu niteleyiciler arasında düzen yönü, en küçük genişlik, kullanılabilir genişlik, kullanılabilir yükseklik, ekran boyutu, ekran en-boy oranı, yuvarlak ekran ve ekran yönü yer alır. Öncelik sırasına göre yapılandırma niteleyicilerinin tam tablosu için Uygulama kaynaklarına genel bakış (Görünümler) başlıklı makaleyi inceleyin.
Nitelik adı kuralları
Yapılandırma niteleyici adlarını kullanmayla ilgili bazı kurallar şunlardır:
- Tek bir kaynak grubu için tireyle ayrılmış birden çok niteleyici belirtebilirsiniz. Örneğin,
drawable-en-rUS-nightgece modundaki ABD İngilizcesi cihazlar için geçerlidir. - Niteleyiciler, Tablo 2'de listelenen sırada olmalıdır.
- Yanlış:
drawable-hdpi-night/ - Doğru:
drawable-night-hdpi/
- Yanlış:
- Alternatif kaynak dizinleri iç içe yerleştirilemez. Örneğin, şunları kullanamazsınız:
res/drawable/drawable-en/. - Değerler büyük/küçük harfe duyarlı değildir. Kaynak derleyici, büyük/küçük harfe duyarsız dosya sistemlerinde sorun yaşamamak için dizin adlarını işlemeden önce küçük harfe dönüştürür. Adlardaki büyük harfler yalnızca okunabilirliği artırmak için kullanılır.
- Her niteleyici türü için yalnızca bir değer desteklenir. Örneğin, İspanya ve Fransa için aynı çizilebilir dosyaları kullanmak istiyorsanız
drawable-es-fr/adlı bir dizininiz olamaz. Bunun yerine, uygun dosyaları içerendrawable-es/vedrawable-fr/gibi iki kaynak dizinine ihtiyacınız vardır.
Alternatif kaynakları bu niteleyicilerle adlandırılmış dizinlere kaydettikten sonra Android, mevcut cihaz yapılandırmasına göre uygulamanızdaki kaynakları otomatik olarak uygular. Bir kaynak her istendiğinde Android, istenen kaynak dosyasını içeren alternatif kaynak dizinlerini kontrol eder ve en iyi eşleşen kaynağı bulur.
Belirli bir cihaz yapılandırmasına uyan alternatif kaynak yoksa Android, ilgili varsayılan kaynakları (yapılandırma niteleyicisi içermeyen belirli bir kaynak türü için kaynak grubu) kullanır.
Takma ad kaynakları oluşturma
Birden fazla cihaz yapılandırmasında kullanmak istediğiniz ancak varsayılan kaynak olarak sağlamak istemediğiniz bir kaynağınız varsa aynı kaynağı birden fazla alternatif kaynak dizinine yerleştirmeniz gerekmez. Bunun yerine, varsayılan kaynak dizininize kaydedilen bir kaynağın diğer adı olarak işlev gören alternatif bir kaynak oluşturabilirsiniz.
Çizilebilir öğeler
Örneğin, icon.png uygulama simgenizin olduğunu ve farklı yerel ayarlar için bu simgenin benzersiz bir sürümüne ihtiyacınız olduğunu düşünelim. Ancak iki yerel ayar (Kanada İngilizcesi ve Kanada Fransızcası) aynı sürümü kullanmalıdır. Aynı resmi hem İngilizce-Kanada hem de Fransızca-Kanada için kaynak dizinine kopyalamanız gerekmez.
Bunun yerine, her ikisi için de kullanılan resmi icon.png dışında herhangi bir adla (ör. icon_ca.png) kaydedip varsayılan res/drawable/ dizinine yerleştirebilirsiniz. Ardından, icon.xml dosyasını res/drawable-en-rCA/ ve res/drawable-fr-rCA/ içinde oluşturun. Bu dosya, <bitmap> öğesini kullanarak icon_ca.png kaynağına referans verir.
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon_ca" />
Bu sayede, PNG dosyasının yalnızca bir sürümünü ve bu dosyayı işaret eden iki küçük XML dosyasını saklayabilirsiniz.
Ardından painterResource(R.drawable.icon) simgesini kullanabilirsiniz. Sistem, yerel ayarı algıladığında uygun dosyayı seçer.
Dizeler ve diğer basit değerler
Mevcut bir dizeye takma ad oluşturmak için yeni dizenin değeri olarak istenen dizenin kaynak kimliğini kullanın:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
R.string.hi kaynağı artık R.string.hello için takma ad olarak kullanılıyor.
Diğer basit değerler de aynı şekilde çalışır. Örneğin renkler:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
Uygulama kaynaklarınıza erişme
Uygulamanızda bir kaynak sağladıktan sonra, kaynak kimliğine referans vererek bu kaynağı uygulayabilirsiniz. Tüm kaynak kimlikleri, projenizin R sınıfında tanımlanır. Bu sınıf, aapt aracı tarafından otomatik olarak oluşturulur.
Uygulamanız derlendiğinde aapt, res/ dizininizdeki tüm kaynakların kaynak kimliklerini içeren R sınıfını oluşturur. Her kaynak türü için R alt sınıfı vardır. Örneğin, tüm çizilebilir kaynaklar için R.drawable alt sınıfı kullanılır. Ayrıca, bu türdeki her kaynak için statik bir tam sayı vardır (ör. R.drawable.icon). Bu tam sayı, kaynağınızı almak için kullanabileceğiniz kaynak kimliğidir.
Kaynak kimlikleri R sınıfında belirtilse de kaynak kimliği bulmak için bu sınıfa bakmanız gerekmez. Kaynak kimliği her zaman aşağıdakilerden oluşur:
- Kaynak türü: Her kaynak,
stringveyadrawablegibi bir "tür" içinde gruplandırılır. - Uzantı hariç dosya adı olan kaynak adı.
Compose'da kaynaklara erişme
Jetpack Compose, kaynaklara güvenli bir şekilde erişmek için yerleşik, composable'a uygun işlevler sağlar.
- Dizeler:
stringResource(id = R.string.hello)
- Çizilebilir öğeler:
painterResource(id = R.drawable.my_icon)
Kullanıcı arayüzü olmayan kodlardaki kaynaklara erişme
Kullanıcı arayüzü hiyerarşinizin dışındaki kaynaklara (ör. ViewModel, Repository veya sistem Service) erişmeniz gerekiyorsa bunları Context kullanarak çözebilirsiniz.
// Retrieve a localized string resource val greeting = context.getString(R.string.hello_world)
Ayrıca, Resources yöntemlerini kullanarak tek tek kaynakları da alabilirsiniz. Bu yöntemlerin örneğini getResources ile alabilirsiniz.
Söz dizimi
Kodda bir kaynağa referans vermek için kullanılan söz dizimi:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>, kaynağın bulunduğu paketin adıdır (kendi paketinizdeki kaynaklara referans verirken gerekli değildir).<resource_type>, kaynak türü içinRalt sınıfıdır.<resource_name>, uzantısız kaynak dosya adı veya basit değerler için XML öğesindekiandroid:nameözellik değeridir.
Her kaynak türü ve bunlara nasıl referans verileceği hakkında daha fazla bilgi için Compose'daki Kaynaklar başlıklı makaleyi inceleyin.
Orijinal dosyalara erişme
Nadiren de olsa orijinal dosyalarınıza ve dizinlerinize erişmeniz gerekebilir. Bu durumda, res/ içinde dosya kaydetme işlemi sizin için çalışmaz. Çünkü res/ içindeki bir kaynağı okumanın tek yolu kaynak kimliğini kullanmaktır. Bunun yerine kaynaklarınızı assets/ dizinine kaydedebilirsiniz.
assets/ dizinine kaydedilen dosyalara kaynak kimliği verilmez. Bu nedenle, bu dosyalara R sınıfı veya XML kaynakları üzerinden başvuramazsınız. Bunun yerine, assets/ dizinindeki dosyaları normal bir dosya sistemi gibi sorgulayabilir ve AssetManager kullanarak ham verileri okuyabilirsiniz.
Ancak tek ihtiyacınız ham verileri (ör. video veya ses dosyası) okuma özelliği ise dosyayı res/raw/ dizinine kaydedin ve openRawResource kullanarak bir bayt akışı okuyun.
Platform kaynaklarına erişim
Android, sistem stilleri ve temalar gibi bir dizi standart kaynak içerir. Bunlara erişmek için kaynak referansınızı android paket sınıfıyla nitelendirin. Örneğin:
painterResource(android.R.drawable.ic_menu_info_details).
Kaynaklarla en iyi cihaz uyumluluğunu sağlama
Uygulamanızın birden fazla cihaz yapılandırmasını desteklemesi için, uygulamanızın kullandığı her kaynak türü için her zaman varsayılan kaynaklar sağlamanız çok önemlidir.
Örneğin, uygulamanız birden fazla dili destekliyorsa dizelerinizi kaydettiğiniz values/ dizinini dil ve bölge niteleyicisi olmadan her zaman ekleyin. Bunun yerine tüm dize dosyalarınızı dil ve bölge niteleyicisi olan dizinlere yerleştirirseniz uygulamanız, dizelerinizin desteklemediği bir dile ayarlanmış cihazda çalıştırıldığında çöker.
Varsayılan values/ kaynakları sağladığınız sürece uygulamanız, kullanıcı sunduğu dili anlamasa bile düzgün şekilde çalışır. Kilitlenmekten daha iyidir.
Varsayılan kaynaklar sağlamak yalnızca uygulamanızın tahmin etmediğiniz bir yapılandırmada çalışabilmesi için değil, aynı zamanda Android'in yeni sürümlerinde bazen daha eski sürümlerin desteklemediği yapılandırma niteleyicileri eklendiği için de önemlidir. Yeni bir kaynak niteleyici kullanırsanız ancak Android'in daha eski sürümleriyle kod uyumluluğunu korursanız Android'in daha eski bir sürümü uygulamanızı çalıştırdığında varsayılan kaynak sağlamadığınız için uygulama çöker. Bunun nedeni, yeni niteleyiciyle adlandırılan kaynakların kullanılamamasıdır.
Örneğin, minSdkVersion değeriniz 4 olarak ayarlanmışsa ve tüm çizilebilir kaynaklarınızı gece modu (API düzeyine 8'de eklenen night veya notnight) kullanarak nitelendiriyorsanız API düzeyi 4 olan bir cihaz, çizilebilir kaynaklarınıza erişemez ve kilitlenir. Bu durumda, notnight değerinin varsayılan kaynaklarınız olmasını istersiniz. Bu nedenle, bu niteleyiciyi hariç tutun ve çizilebilir kaynaklarınızı drawable/ veya drawable-night/ içine yerleştirin.
Kısacası, en iyi cihaz uyumluluğunu sağlamak için uygulamanızın düzgün çalışması için gereken kaynaklar için her zaman varsayılan kaynaklar sağlayın. Ardından, yapılandırma niteleyicilerini kullanarak belirli cihaz yapılandırmaları için alternatif kaynaklar oluşturun.
Bu kuralın bir istisnası vardır: Uygulamanızın minSdkVersion değeri 4 veya daha yüksekse ekran yoğunluğu niteleyicisiyle alternatif çizilebilir kaynaklar sağladığınızda varsayılan çizilebilir kaynaklara ihtiyacınız yoktur. Android, varsayılan çizilebilir kaynaklar olmasa bile alternatif ekran yoğunlukları arasında en iyi eşleşmeyi bulabilir ve gerektiğinde bit eşlemleri ölçeklendirebilir. Ancak tüm cihaz türlerinde en iyi deneyimi sunmak için üç yoğunluk türünün tümü için alternatif çizilebilir öğeler sağlayın.
Android, en iyi eşleşen kaynağı nasıl bulur?
Alternatifler sağladığınız bir kaynak istediğinizde Android, mevcut cihaz yapılandırmasına bağlı olarak çalışma zamanında hangi alternatif kaynağın kullanılacağını seçer. Android'in alternatif bir kaynağı nasıl seçtiğini göstermek için aşağıdaki drawable dizinlerinin her birinin aynı resimlerin farklı sürümlerini içerdiğini varsayalım:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/
Aşağıdaki cihaz yapılandırmasının olduğunu varsayalım:
Yerel ayar = en-GB
Gece modu = night
Ekran piksel yoğunluğu = hdpi
Dokunmatik ekran türü = notouch
Birincil metin giriş yöntemi = 12key
Android, cihaz yapılandırmasını mevcut alternatif kaynaklarla karşılaştırarak drawable-en-night içinden çizilebilir öğeler seçer.
Sistem, hangi kaynakların kullanılacağına karar verirken aşağıdaki mantığı uygular:
Şekil 2. Android'in en iyi eşleşen kaynağı nasıl bulduğunu gösteren akış şeması.
- Cihaz yapılandırmasıyla çelişen kaynak dosyalarını ortadan kaldırın.
drawable-fr-rCA/dizini,en-GByerel ayarıyla çeliştiği için kaldırıldı.drawable/ drawable-en/
drawable-fr-rCA/drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/İstisna: Ekran piksel yoğunluğu, çelişki nedeniyle ortadan kaldırılmayan tek niteleyicidir. Cihazın ekran yoğunluğu hdpi olsa da bu noktada her ekran yoğunluğu eşleşme olarak kabul edildiğinden
drawable-night-ldpi/kaldırılmaz. Daha fazla bilgi için Ekran uyumluluğuna genel bakış başlıklı makaleyi inceleyin. - Listedeki bir sonraki en yüksek öncelikli niteleyiciyi bulun (Tablo 2). (Satıcı Kategorisi Kodu ile başlayın.)
- Kaynak dizinlerinden herhangi birinde bu niteleyici var mı?
- Hayırsa ikinci adıma dönün ve sonraki niteleyiciye bakın. Bu örnekte, dil niteleyicisine ulaşılana kadar yanıt "hayır"dır.
- Evet ise dördüncü adıma geçin.
- Bu niteleyiciyi içermeyen kaynak dizinlerini ortadan kaldırın. Bu örnekte, sistem sonraki adımda dil niteleyicisi içermeyen tüm dizinleri ortadan kaldırır:
drawable/drawable-en/ drawable-en-night/ drawable-en-notouch-12key/drawable-night-ldpi/drawable-night-notouch-12key/İstisna: Söz konusu niteleyici ekran piksel yoğunluğuysa Android, cihazın ekran yoğunluğuyla en çok eşleşen seçeneği belirler. Genel olarak Android, daha küçük bir orijinal resmi büyütmek yerine daha büyük bir orijinal resmi küçültmeyi tercih eder. Daha fazla bilgi için Ekran uyumluluğuna genel bakış başlıklı makaleyi inceleyin.
- Yalnızca bir dizin kalana kadar ikinci, üçüncü ve dördüncü adımları tekrarlayın. Bu örnekte, gece modu, eşleşme olan bir sonraki niteleyicidir.
Bu nedenle, gece modunu belirtmeyen kaynaklar elenir:
drawable-en/drawable-en-night/drawable-en-notouch-12key/Kalan dizin
drawable-en-night.
Bu prosedür istenen her kaynak için yürütülse de sistem, prosedürün bazı yönlerini optimize eder. Bu optimizasyonlardan biri, cihaz yapılandırması bilindikten sonra hiçbir zaman eşleşemeyecek alternatif kaynakları ortadan kaldırabilmesidir. Örneğin, yapılandırma dili İngilizce ise dil niteleyicisi İngilizce dışında bir dile ayarlanmış olan kaynak dizinleri, kontrol edilen kaynak havuzuna hiçbir zaman dahil edilmez (ancak dil niteleyicisi olmayan bir kaynak dizini yine de dahil edilir).
Sistem, ekran boyutu niteleyicilerine göre kaynak seçerken daha iyi eşleşen kaynak yoksa mevcut ekrandan daha küçük bir ekran için tasarlanmış kaynakları kullanır. Örneğin, büyük boyutlu bir ekranda gerekirse normal boyutlu ekran kaynakları kullanılır.
Ancak, mevcut ekrandan daha büyük kaynaklar varsa sistem bunları kullanmaz ve başka kaynaklar cihaz yapılandırmasıyla eşleşmezse uygulamanız çöker. Örneğin, tüm düzen kaynakları xlarge niteleyicisiyle etiketlenmişse ancak cihaz normal boyutlu bir ekrana sahipse bu durum yaşanır.
Not: Niteleyicinin önceliği (Tablo 2'de), cihazla tam olarak eşleşen niteleyici sayısından daha önemlidir. Önceki örnekte, dördüncü adımda listedeki son seçim, cihazla tam olarak eşleşen üç niteleyici (gece modu, dokunmatik ekran türü ve giriş yöntemi) içerirken drawable-en yalnızca eşleşen bir parametreye (dil) sahiptir. Ancak dil, bu diğer niteleyicilere göre daha yüksek önceliğe sahiptir. Bu nedenle drawable-night-notouch-12key elenir.
Ek kaynaklar
Uygulama kaynakları hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın: