Kaynaklar, kodunuzun kullandığı ek dosyalar ve statik içeriklerdir. Örneğin, bit eşlemler, düzen tanımları, kullanıcı arayüzü dizeleri, animasyon talimatları vb.
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, ekran boyutuna bağlı olarak farklı bir kullanıcı arayüzü yerleşimi veya 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.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
res/ dizini, alt dizinlerindeki tüm kaynakları içerir: bir resim kaynağı, iki düzen kaynağı, başlatıcı simgeleri için bir mipmap/ dizini ve bir dize kaynağı 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ü |
|---|---|
animator/ |
Özellik animasyonlarını tanımlayan XML dosyaları. |
anim/ |
Tween animasyonlarını tanımlayan XML dosyaları. Özellik animasyonları da bu dizine kaydedilebilir ancak iki tür arasında ayrım yapmak için özellik animasyonlarında animator/ dizini tercih edilir. |
color/ |
Renklerin durum listesini tanımlayan XML dosyaları. Daha fazla bilgi için Renk durum listesi kaynağı başlıklı makaleyi inceleyin. |
drawable/ |
Şu çizilebilir 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. |
layout/ |
Kullanıcı arayüzü düzenini tanımlayan XML dosyaları. Daha fazla bilgi için Düzen kaynağı başlıklı makaleyi inceleyin. |
menu/ |
Seçenekler menüsü, içerik menüsü veya alt menü gibi uygulama menülerini tanımlayan XML dosyaları. Daha fazla bilgi için Menü kaynağı 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ı. Arama yapılandırması gibi ç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.
Kaynak türleri hakkında daha fazla bilgi için Kaynak türlerine genel bakış başlıklı makaleyi inceleyin.
1. tabloda 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, ekstra ekran alanından yararlanmak için normalden daha büyük ekranlara sahip cihazlar için farklı düzen kaynakları sağlayabilirsiniz. Ayrıca, cihazın dil ayarına göre kullanıcı arayüzünüzdeki metni çeviren farklı dize kaynakları da sağlayabilirsiniz. Farklı cihaz yapılandırmaları için bu farklı kaynakları sağlamak üzere varsayılan kaynaklarınıza ek olarak alternatif kaynaklar da sağlamanız gerekir.
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.
Şekil 1. Ekran boyutuna göre farklı düzen kaynakları kullanan iki cihaz.
Bir kaynak grubu 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ırada yer alıyorsa 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 çizilebilir dizinlerdeki 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 geçerli 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. MCC 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 |
| 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:
Android'de Dil Bilgisi Çekimi başlıklı makaleyi inceleyin. Dilbilgisel cinsiyeti belirten API düzeyi 34'te eklendi. |
| Düzen yönü | ldrtlldltr |
Uygulamanızın düzen yönü. Bu, düzenler, çizilebilir öğeler veya değerler gibi tüm kaynaklar için geçerli olabilir. Örneğin, Arapça için belirli bir düzen, Farsça veya İbranice gibi diğer tüm "sağdan sola" diller için ise genel bir düzen sağlamak istiyorsanız aşağıdaki gibi dizinler kullanırsınız:
Not: Uygulamanızda sağdan sola düzen özelliklerini etkinleştirmek için API düzeyi 17'de eklenmiştir. |
| En küçük genişlik | sw<N>dpÖrnekler: sw320dpsw600dpsw720dpvb. |
Bir uygulamanın kullanabileceği ekran alanının en kısa boyutu.
Daha net bir ifadeyle, uygulama penceresinin
Örneğin, düzeninizin ekran alanının en küçük boyutunun her zaman en az 600 dp olmasını gerektiriyorsa düzen kaynaklarını Genel ekran boyutunu belirlemek için en küçük genişliği kullanmak faydalıdır. Çünkü genişlik genellikle düzen tasarlarken belirleyici faktördür. Kullanıcı arayüzü genellikle dikey olarak kaydırılır ancak yatay olarak ihtiyaç duyduğu minimum alan konusunda oldukça katı kısıtlamaları vardır. Kullanılabilir genişlik, cep telefonları için tek panelli düzenin mi yoksa tabletler için çok panelli düzenin mi kullanılacağını belirleyen temel faktördür. Bu nedenle, her cihazda mümkün olan en küçük genişliğin ne olduğu sizin için en önemli nokta olabilir. Cihazın en küçük genişliği, ekran süslemelerini ve sistem kullanıcı arayüzünü dikkate alır. Örneğin, cihazda en küçük genişlik ekseni boyunca alan kaplayan kalıcı kullanıcı arayüzü öğeleri varsa sistem, en küçük genişliği gerçek ekran boyutundan daha küçük olarak bildirir. Bunun nedeni, bu öğelerin kullanıcı arayüzünüz için kullanılamayan ekran pikselleri olmasıdır. Burada yaygın ekran boyutları için kullanabileceğiniz bazı değerler:
Uygulamanız API düzeyi 13'te eklendi. Ayrıca, uygulamanızın uyumlu olduğu minimum Bu niteleyiciyi kullanarak farklı ekranlar için tasarım yapma hakkında daha fazla bilgi edinmek için Görünümlerle duyarlı/uyarlanabilir tasarım başlıklı makaleyi inceleyin. |
| Kullanılabilir genişlik ve yükseklik | w<N>dph<N>dpÖrnekler: w720dpw1024dph720dph1024dpvb. |
Kaynağın kullanıldığı minimum kullanılabilir ekran genişliğini veya yüksekliğini ( Kullanılabilir genişlik ve yükseklik, çok panelli bir düzen kullanıp kullanmayacağınızı belirlemek için genellikle yararlıdır. Bunun nedeni, tablet cihazlarda bile dikey yönlendirme için istediğiniz çok panelli düzenin yatay yönlendirme için istediğinizle aynı olmamasıdır. Bu nedenle, ekran boyutu ve yön niteleyicilerini birlikte kullanmak yerine, düzen için gereken minimum genişliği ve/veya yüksekliği belirtmek üzere bunları kullanabilirsiniz. Uygulamanız bu yapılandırmalar için farklı değerlere sahip birden fazla kaynak dizini sağladığında sistem, cihazın mevcut ekran genişliğine en yakın olanı (aşmadan) kullanır. En yakın, gerçek ekran genişliği ile belirtilen genişlik arasındaki farklar, gerçek ekran yüksekliği ile belirtilen yükseklik arasındaki farka eklenerek belirlenir. Belirtilmeyen yükseklik ve genişliklerin değeri 0'dır. Değerler, pencere iç kısımlarının kapladığı alanı hariç tutar. Bu nedenle, cihazda ekranın kenarlarında kalıcı kullanıcı arayüzü öğeleri varsa uygulama,
Sabit olmayan bazı dikey ekran süslemeleri (ör. tam ekran modunda gizlenebilen telefon durum çubuğu) ve pencere süslemeleri (ör. başlık çubuğu veya işlem çubuğu) burada hesaba katılmamıştır. Bu nedenle, uygulamalar belirttiklerinden biraz daha küçük bir alanla çalışmaya hazır olmalıdır. Not: Sistem, hem genişlik hem de yükseklik açısından eşleşen kaynağı seçer. Bu nedenle, her ikisini de belirten bir kaynak, yalnızca birini belirten bir kaynağa göre çok daha fazla tercih edilir. Örneğin, gerçek ekran 720 dp genişliğinde ve 1.280 dp yüksekliğinde ise bir kaynak w720dp olarak, diğeri ise w700dp-h1200dp olarak nitelendirilir. Bu durumda, ilki belirttiği değerle tam olarak eşleşse de ikincisi seçilir. API düzeyi 13'te eklendi. Ayrıca, mevcut ekran genişliğini ve yüksekliğini içeren Bu niteleyiciyi kullanarak farklı ekranlar için tasarım yapma hakkında daha fazla bilgi edinmek için Görünümlerle duyarlı/uyarlanabilir tasarım başlıklı makaleyi inceleyin. |
| Ekran boyutu |
smallnormallargexlarge
|
Not: Boyut niteleyicisi kullanmak, kaynakların yalnızca bu boyuttaki ekranlar için olduğu anlamına gelmez. Mevcut cihaz yapılandırmasıyla daha iyi eşleşen niteleyicilere sahip alternatif kaynaklar sağlamazsanız sistem, en iyi eşleşen kaynakları kullanabilir. Dikkat: Tüm kaynaklarınız mevcut ekrandan daha büyük bir boyut niteleyicisi kullanıyorsa sistem bu kaynakları kullanmaz ve uygulamanız çalışma zamanında çöker. Örneğin, tüm düzen kaynakları API düzeyi 4'te eklenmiştir. Ekranın küçük, normal veya büyük olup olmadığını gösteren Daha fazla bilgi için Ekran uyumluluğuna genel bakış başlıklı makaleyi inceleyin. |
| Ekran en-boy oranı |
longnotlong
|
API düzeyi 4'te eklenmiştir. Bu tamamen ekranın en boy oranına bağlıdır ( Ayrıca, ekranın uzun olup olmadığını belirten |
| Yuvarlak ekran |
roundnotround
|
API düzeyi 23'te eklenmiştir. Ayrıca, ekranın yuvarlak olup olmadığını belirten |
| 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 |
| Ekran yönlendirme |
portland
|
Kullanıcı ekranı döndürürse bu değer uygulamanızın kullanım süresi 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, mevcut cihaz yönünü gösteren |
| Kullanıcı arayüzü modu |
cardesktelevisionappliancewatchvrheadset
|
API düzeyi 8'de eklendi. Televizyon API düzeyi 13'te, kol saati ise API düzeyi 20'de eklendi. Cihaz bir yerleştirme istasyonuna takıldığında veya istasyondan çı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. Donanım klavyesinin görünürlüğünü ve yazılım klavyesi de dahil olmak üzere herhangi bir klavye türünün görünürlüğünü gösteren 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. Örneğin, w600dp niteleyicisinin kullanılması, v13 niteleyicisini otomatik olarak içerir. Bunun nedeni, available-width niteleyicisinin API düzeyi 13'te yeni olmasıdır. 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.
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-landyatay yöndeki ABD İngilizcesi cihazlarda geçerlidir. - Niteleyiciler, 2. tabloda listelenen sırada olmalıdır.
- Yanlış:
drawable-hdpi-port/ - Doğru:
drawable-port-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. Ancak dosyaları her iki konumda da gerçekten kopyalamanız gerekmez. Bunun yerine, Alias kaynakları oluşturma bölümünde açıklandığı gibi bir kaynak için alias oluşturabilirsiniz.
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 ardından 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 kümesi) 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.
Not: Tüm kaynaklar, başka bir kaynak için takma ad oluşturabileceğiniz bir mekanizma sunmaz. Özellikle xml/ dizinindeki animasyon, menü, ham ve belirtilmemiş diğer kaynaklar bu özelliği sunmaz.
Ö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 varsayalım. Ancak İngilizce-Kanada ve Fransızca-Kanada olmak üzere iki yerel ayarın aynı sürümü kullanması gerekir. Hem İngilizce hem de Fransızca Kanada için aynı resmi 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, <bitmap> öğesini kullanarak icon_ca.png kaynağına başvuran bir icon.xml dosyası oluşturun.res/drawable-en-rCA/res/drawable-fr-rCA/ 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. Ayrıntılar için aşağıdaki bölümlerdeki örneklere bakın.
Çekilebilir
Mevcut bir çizilebilir öğe için takma ad oluşturmak üzere <drawable> öğesini kullanın:
<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="icon">@drawable/icon_ca</drawable> </resources>
Bu dosyayı icon.xml olarak res/values-en-rCA/ gibi alternatif bir kaynak dizinine kaydederseniz R.drawable.icon olarak başvurabileceğiniz bir kaynağa derlenir ancak aslında res/drawable/'e kaydedilen R.drawable.icon_ca kaynağının diğer adıdır.
Düzen
Mevcut bir düzene takma ad oluşturmak için <include>
öğesini <merge> içine alın:
<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
Bu dosyayı main.xml olarak kaydederseniz R.layout.main olarak başvurabileceğiniz bir kaynakta derlenir ancak aslında R.layout.main_ltr kaynağının diğer adıdır.
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. Bu türdeki her kaynak için statik bir tam sayı vardır. Örneğin, 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
string,drawablevelayoutgibi bir "tür" içinde gruplandırılır. Farklı türler hakkında daha fazla bilgi için Kaynak türlerine genel bakış başlıklı makaleyi inceleyin. - Uzantı hariç dosya adı veya kaynak basit bir değerse (ör. dize) XML
android:nameözelliğindeki değer olan kaynak adı.
Bir kaynağa erişmenin iki yolu vardır:
- Kodda:
Rsınıfınızın bir alt sınıfından statik bir tam sayı kullanma (ör. aşağıdaki gibi):R.string.hello
stringkaynak türü,helloise kaynak adıdır. Bu biçimde bir kaynak kimliği sağladığınızda kaynaklarınıza erişebilen birçok Android API'si vardır. Daha fazla bilgi için Kodda kaynaklara erişme bölümüne bakın. - XML'de:
Rsınıfınızda tanımlanan kaynak kimliğine karşılık gelen özel bir XML söz dizimi kullanılarak (ör. aşağıdaki gibi):@string/hello
stringkaynak türü,helloise kaynak adıdır. Bu söz dizimini, bir XML kaynağında, kaynakta sağladığınız bir değerin beklendiği her yerde kullanabilirsiniz. Daha fazla bilgi için XML'den kaynaklara erişme bölümüne bakın.
Kodda kaynaklara erişme
Kaynak kimliğini yöntem parametresi olarak ileterek kodu bir kaynakta kullanabilirsiniz. Örneğin, ImageView kullanarak res/drawable/myimage.png kaynağını setImageResource() ile kullanmak için bir ImageView ayarlayabilirsiniz:
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);
Ayrıca, Resources yöntemlerini kullanarak tek tek kaynakları da alabilirsiniz. Bu yöntemlerin örneğini getResources() ile alabilirsiniz.
Sözdizimi
Kodda bir kaynağa referans verme söz dizimi şöyledir:
[<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 Kaynak türlerine genel bakış başlıklı makaleyi inceleyin.
Kullanım örnekleri
Kaynak kimliği parametresini kabul eden birçok yöntem vardır ve kaynakları Resources içindeki yöntemleri kullanarak alabilirsiniz. Context.getResources() kullanarak Resources örneği alabilirsiniz.
Kodda kaynaklara erişmeyle ilgili bazı örnekler:
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);
Dikkat: R.java dosyasını manuel olarak değiştirmeyin. Projeniz derlendiğinde aapt aracı tarafından oluşturulur. Yaptığınız değişiklikler, bir sonraki derleme işleminde geçersiz kılınır.
XML'den kaynaklara erişme
Mevcut bir kaynağa referans vererek bazı XML özellikleri ve öğeleri için değerler tanımlayabilirsiniz. Bu işlemi genellikle düzen dosyaları oluştururken widget'larınız için dizeler ve resimler sağlamak amacıyla yaparsınız.
Örneğin, düzeninize Button ekliyorsanız düğme metni için dize kaynağı kullanın:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/submit" />
Sözdizimi
Bir XML kaynağındaki kaynağa referans vermek için kullanılan söz dizimi aşağıda verilmiştir:
@[<package_name>:]<resource_type>/<resource_name>
<package_name>, kaynağın bulunduğu paketin adıdır (aynı paketteki kaynaklara referans verilirken gerekli değildir).<resource_type>, kaynak türü içinRalt sınıfıdır.<resource_name>, basit değerler için uzantısız kaynak dosya adı veya XML öğesindekiandroid:nameözellik değeridir.
Her kaynak türü ve bunlara nasıl referans verileceği hakkında daha fazla bilgi için Kaynak türlerine genel bakış başlıklı makaleyi inceleyin.
Kullanım örnekleri
Bazı durumlarda, XML'deki bir değer için kaynak kullanmanız gerekir. Örneğin, bir widget'a çizilebilir bir resim uygulamak için kaynak kullanmanız gerekir. Ancak XML'de basit bir değerin kabul edildiği her yerde kaynak da kullanabilirsiniz. Örneğin, renk kaynağı ve dize kaynağı içeren aşağıdaki kaynak dosyanız varsa:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
Metin rengini ve metin dizesini ayarlamak için aşağıdaki düzen dosyasında bu kaynakları kullanabilirsiniz:
<?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" />
Bu durumda, kaynaklar kendi paketinizden olduğundan kaynak referansında paket adını belirtmeniz gerekmez. Bir sistem kaynağına referans vermek için aşağıdaki örnekte gösterildiği gibi paket adını eklemeniz gerekir:
<?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" />
Not: Uygulamanızın diğer dillerde yerelleştirilebilmesi için her zaman dize kaynaklarını kullanın. Alternatif kaynaklar (ör. yerelleştirilmiş dizeler) oluşturma hakkında bilgi edinmek için Alternatif kaynaklar sağlama 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.
Takma ad oluşturmak için XML'deki kaynakları bile kullanabilirsiniz. Örneğin, başka bir drawable kaynağın takma adı olan bir drawable kaynak oluşturabilirsiniz:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/other_drawable" />
Bu kulağa gereksiz gibi gelse de alternatif kaynak kullanırken çok faydalı olabilir. Daha fazla bilgi için takma ad kaynakları oluşturma bölümüne bakın.
Referans stili özellikleri
Stil özelliği kaynağı, şu anda uygulanan temadaki bir özelliğin değerine başvurmanıza olanak tanır. Bir stil özelliğine referans vermek, sabit kodlu bir değer sağlamak yerine, mevcut tema tarafından sağlanan standart varyasyonlarla eşleşecek şekilde stil vererek kullanıcı arayüzü öğelerinin görünümünü özelleştirmenize olanak tanır. Bir stil özelliğine referans vermek, temelde "Geçerli temada bu özellik tarafından tanımlanan stili kullan" anlamına gelir.
Bir stil özelliğine referans vermek için ad söz dizimi, normal kaynak biçimiyle neredeyse aynıdır ancak "at" simgesi (@) yerine soru işareti (?) kullanılır. Kaynak türü kısmı isteğe bağlıdır. Bu nedenle, referans söz dizimi aşağıdaki gibidir:
?[<package_name>:][<resource_type>/]<resource_name>
Örneğin, metin rengini sistem temasının ikincil metin rengiyle eşleşecek şekilde ayarlamak için bir özelliğe nasıl referans verebileceğinizi aşağıda görebilirsiniz:
<EditText id="text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="?android:textColorSecondary" android:text="@string/hello_world" />
Burada android:textColor özelliği, geçerli temadaki bir stil özelliğinin adını belirtir. Android artık bu widget'ta android:textColorSecondary
style özelliğine uygulanan değeri android:textColor değeri olarak kullanıyor. Sistem kaynağı aracı, bu bağlamda bir özellik kaynağı beklendiğini bildiğinden türü (?android:attr/textColorSecondary) açıkça belirtmeniz gerekmez. attr türünü hariç tutabilirsiniz.
Orijinal dosyalara erişme
Nadiren de olsa orijinal dosya ve dizinlerinize erişmeniz gerekebilir. Bu durumda, res/ içindeki dosyalarınızı kaydetmek işe yaramaz. Çü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şme
Android; stiller, temalar ve düzenler gibi bir dizi standart kaynak içerir. Bu kaynaklara erişmek için kaynak referansınızı android paket adıyla niteleyin. Örneğin, Android, ListAdapter içindeki liste öğeleri için kullanabileceğiniz bir düzen kaynağı sağlar:
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));
Bu örnekte simple_list_item_1, ListView içindeki öğeler için platform tarafından tanımlanan bir düzen kaynağıdır. Liste öğeleri için kendi düzeninizi oluşturmak yerine bunu kullanabilirsiniz.
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 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 kilitlenir.
Varsayılan values/ kaynakları sağladığınız sürece uygulamanız, kullanıcının sunduğu dili anlamaması durumunda bile düzgün şekilde çalışır. Kilitlenmekten daha iyidir.
Benzer şekilde, ekran yönüne göre farklı düzen kaynakları sağlıyorsanız bir yönü varsayılan olarak seçin. Örneğin, yatay için layout-land/ ve dikey için layout-port/ düzen kaynakları sağlamak yerine birini varsayılan olarak bırakın (ör. yatay için layout/ ve dikey için layout-port/).
Varsayılan kaynaklar sağlamak yalnızca uygulamanızın öngörmediğiniz bir yapılandırmada çalışabilmesi için değil, aynı zamanda Android'in yeni sürümlerinde bazen eski sürümlerin desteklemediği yapılandırma niteleyicileri eklendiği için de önemlidir. Yeni bir kaynak niteleyici kullanır ancak Android'in eski sürümleriyle kod uyumluluğunu korursanız Android'in 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 bit eşlemleri gerektiği gibi ö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-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
Aşağıdaki cihaz yapılandırmasının olduğunu varsayalım:
Yerel ayar = en-GB
Ekran yönü = port
Ekran piksel yoğunluğu = hdpi
Dokunmatik ekran türü = notouch
Birincil metin girişi yöntemi = 12key
Android, cihaz yapılandırmasını mevcut alternatif kaynaklarla karşılaştırarak drawable-en-port 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-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-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-port-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-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-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, ekran yönü eşleşme olan bir sonraki niteleyendir.
Bu nedenle, ekran yönü belirtmeyen kaynaklar elenir:
drawable-en/drawable-en-port/drawable-en-notouch-12key/Kalan dizin
drawable-en-port.
Bu prosedür istenen her kaynak için yürütülse de sistem, bazı yönlerini optimize eder. Bu tür bir optimizasyon, cihaz yapılandırması bilindikten sonra hiçbir zaman eşleşemeyecek alternatif kaynakları ortadan kaldırabilir. Ö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çenek, cihazla tam olarak eşleşen üç niteleyici (yön, 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-port-notouch-12key elenir.