Uygulama kaynaklarına genel bakış

Kaynaklar, kodunuzun kullandığı ek dosyalar ve statik içeriktir (ör. bit eşlemler, düzen tanımları, kullanıcı arayüzü dizeleri, animasyon talimatları ve daha fazlası).

Kodunuzdaki resim ve dize gibi uygulama kaynaklarını her zaman harici hale getirerek bunları bağımsız şekilde saklayabilirsiniz. Ayrıca, belirli cihaz yapılandırmalarını özel olarak adlandırılmış kaynak dizinlerinde gruplandırarak bu yapılandırmalar için alternatif kaynaklar da sağlayabilirsiniz. Android, çalışma zamanında mevcut yapılandırmaya göre uygun kaynağı kullanır. Örneğin, ekran boyutuna göre farklı bir kullanıcı arayüzü düzeni veya dil ayarına bağlı olarak farklı dizeler sağlamak isteyebilirsiniz.

Uygulama kaynaklarınızı harici hale getirdikten sonra, projenizin R sınıfında oluşturulan kaynak kimliklerini kullanarak bunlara erişebilirsiniz. Bu dokümanda, Android projenizdeki kaynakları nasıl gruplandıracağınız gösterilmektedir. Ayrıca, belirli cihaz yapılandırmaları için nasıl alternatif kaynaklar sağlayacağınızı ve ardından bu kaynaklara uygulama kodunuzdan veya diğer XML dosyalarından nasıl erişebileceğinizi de gösterir.

Grup kaynak türleri

Her bir kaynak türünü projenizin res/ dizininin belirli bir alt dizinine yerleştirin. Örneğin, basit bir projenin dosya hiyerarşisini burada görebilirsiniz:

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 kaynak dosyası. Kaynak dizini adları önemlidir ve 1. tabloda açıklanmıştır.

Not: Mipmap klasörlerini kullanma hakkında daha fazla bilgi için Uygulama simgelerini mipmap dizinlerine yerleştirme konusuna bakın.

Tablo 1. Kaynak dizinleri, res/ projesinin dizininde desteklenir.

Dizin Kaynak Türü
animator/ Özellik animasyonlarını tanımlayan XML dosyaları.
anim/ Tween animasyonlarını tanımlayan XML dosyaları. Mülk animasyonları da bu dizine kaydedilebilir. Ancak iki türü birbirinden ayırt edebilmek için mülk animasyonlarında animator/ dizini tercih edilir.
color/ Renklerin durum listesini tanımlayan XML dosyaları. Daha fazla bilgi için Renk durumu listesi kaynağı bölümüne bakın.
drawable/

Aşağıdaki çekilebilir kaynak alt türlerinde derlenen bit eşlem dosyaları (PNG, .9.png, JPG veya GIF) ya da XML dosyaları:

  • Bit eşlem dosyaları
  • Dokuz yama (yeniden boyutlandırılabilir bit eşlemler)
  • Eyalet listeleri
  • Şekiller
  • Animasyon çekilebilir öğeleri
  • Diğer çekilebilir öğeler

Daha fazla bilgi için Çekilebilir kaynaklar bölümünü inceleyin.

mipmap/ Farklı başlatıcı simgesi yoğunlukları için çekilebilir dosyalar. mipmap/ klasörleriyle başlatıcı simgelerini yönetme hakkında daha fazla bilgi için Uygulama simgelerini harita dizinlerine yerleştirme konusuna bakın.
layout/ Kullanıcı arayüzü düzenini tanımlayan XML dosyaları. Daha fazla bilgi için Düzen kaynağı konusuna bakın.
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ğı bölümüne bakın.
raw/

Ham biçiminde kaydedilecek rastgele dosyalar. Bu kaynakları ham InputStream ile açmak için R.raw.filename olan kaynak kimliğiyle Resources.openRawResource() yöntemini çağırın.

Ancak orijinal dosya adlarına ve dosya hiyerarşisine erişmeniz gerekirse kaynakları res/raw/ yerine assets/ dizinine kaydetmeyi düşünebilirsiniz. assets/ içindeki dosyalara bir kaynak kimliği verilmez. Bu nedenle, bunları yalnızca AssetManager kullanarak okuyabilirsiniz.

values/

Dizeler, tam sayılar ve renkler gibi basit değerler içeren XML dosyaları.

Diğer res/ alt dizinlerindeki XML kaynak dosyaları ise XML dosya adına göre tek bir kaynağı tanımlarken values/ dizinindeki dosyalar birden fazla kaynağı tanımlar. Bu dizindeki bir dosya için <resources> öğesinin her alt öğesi tek bir kaynağı tanımlar. Örneğin, <string> öğesi bir R.string kaynağı, <color> öğesi ise bir R.color kaynağı oluşturur.

Her kaynak kendi XML öğesiyle tanımlandığından dosyayı istediğiniz gibi adlandırabilir ve farklı kaynak türlerini bir dosyaya yerleştirebilirsiniz. Ancak, netlik açısından benzersiz kaynak türlerini farklı dosyalara yerleştirmek isteyebilirsiniz. Örneğin, bu dizinde oluşturabileceğiniz kaynaklar için bazı dosya adı kurallarını aşağıda bulabilirsiniz:

Daha fazla bilgi için Dize kaynakları, Stil kaynağı ve Diğer kaynak türleri bölümlerine bakın.

xml/ Resources.getXML() çağrısı yapılarak çalışma zamanında okunabilen rastgele XML dosyaları. Arama yapılandırması gibi çeşitli XML yapılandırma dosyalarının buraya kaydedilmesi gerekir.
font/ TTF, OTF veya TTC gibi uzantılara sahip yazı tipi dosyaları ya da <font-family> öğesi içeren XML dosyaları. Yazı tiplerini kaynak olarak kullanma hakkında daha fazla bilgi için Yazı tipini XML kaynağı olarak ekleme bölümüne bakın.

Dikkat: Kaynak dosyalarını hiçbir zaman doğrudan res/ dizinine kaydetmeyin. Derleyici hatasına neden olur.

Tek tek kaynak türleri hakkında daha fazla bilgi için Kaynak türlerine genel bakış başlıklı makaleyi inceleyin.

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. Bununla birlikte, Android destekli farklı cihaz türleri farklı kaynak türleri gerektirebilir.

Örneğin, ekstra ekran alanından faydalanmak amacıyla normalden daha büyük ekranlara sahip cihazlar için farklı düzen kaynakları sağlayabilirsiniz. Cihazın dil ayarına bağlı olarak kullanıcı arayüzünüzdeki metni çeviren farklı dize kaynakları da sağlayabilirsiniz. Farklı cihaz yapılandırmalarında bu farklı kaynakları sağlamak için varsayılan kaynaklarınızın yanı sıra 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 çekilebilir 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:

  1. res/ bölgesinde <resources_name>-<qualifier> biçiminde yeni bir dizin oluşturun.
    • <resources_name>, ilgili varsayılan kaynakların dizin adıdır (tablo 1'de tanımlanmıştır).
    • <qualifier>, bu kaynakların kullanılacağı bağımsız bir yapılandırmayı belirten addır (Tablo 2'de tanımlanmıştır).

    Birden fazla <qualifier> ekleyebilirsiniz. Her birini bir kısa çizgiyle ayırın.

    Dikkat: Birden fazla niteleyici eklerken bunları tablo 2'de listelendikleri sırayla yerleştirmeniz gerekir. Niteleyiciler yanlış sıralanırsa kaynaklar göz ardı edilir.

  2. İlgili alternatif kaynakları bu yeni dizine kaydedin. Kaynak dosyaları, varsayılan kaynak dosyalarıyla tam olarak 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, bu dizindeki kaynakların yüksek yoğunluklu ekrana sahip cihazlar için olduğunu belirtir. Bu çekilebilir dizinlerdeki resimler, belirli ekran yoğunlukları için boyutlandırılır, ancak dosya adları tamamen aynıdır. Bu şekilde, icon.png veya background.png görüntüsüne referans vermek için kullandığınız kaynak kimliği her zaman aynı olur. Android, cihaz yapılandırma bilgilerini kaynak dizini adındaki niteleyicilerle karşılaştırarak her kaynağın mevcut cihazla en iyi eşleşen sürümünü seçer.

Dikkat: Alternatif bir kaynak tanımlarken kaynağı da varsayılan yapılandırmada tanımladığınızdan emin olun. Aksi takdirde, cihaz bir yapılandırmayı değiştirdiğinde uygulamanız çalışma zamanı istisnalarıyla karşılaşabilir. Örneğin, values yerine yalnızca values-en öğesine bir dize eklerseniz kullanıcı varsayılan sistem dilini değiştirdiğinde uygulamanız bir Resource Not Found istisnasıyla karşılaşabilir.

Tablo 2'de geçerli yapılandırma niteleyicileri öncelik sırasına göre listelenmiştir. Her niteleyiciyi kısa çizgiyle ayırarak 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ıdır.

Yapılandırma Niteleyici değerleri Açıklama
MM ve MNC Örnekler:
mcc310
mcc310-mnc004
mcc208-mnc00

Mobil ülke kodu (MM) ve isteğe bağlı olarak ardından cihazdaki SIM kartta bulunan mobil ağ kodu (MNC). Örneğin, mcc310 herhangi bir operatörde ABD'dir, mcc310-mnc004 Verizon'da ABD'dir ve mcc208-mnc00, Orange'da Fransa'dır.

Cihaz radyo bağlantısı kullanıyorsa (yani bir GSM telefonuysa), MM ve MNC değerleri SIM karttan gelir.

Örneğin, uygulamanıza ülkeye özgü yasal kaynaklar eklemek için MM'yi tek başına da kullanabilirsiniz. Bunu yalnızca dile göre belirtmeniz gerekiyorsa bunun yerine dil, komut dosyası (isteğe bağlı) ve bölge (isteğe bağlı) niteleyicisini kullanın. MM ve MNC niteleyicisini kullanıyorsanız bunu dikkatli bir şekilde yapın ve beklendiği gibi çalışıp çalışmadığını test edin.

Ayrıca, sırasıyla geçerli mobil ülke kodunu ve mobil ağ kodunu belirten mcc ve mnc yapılandırma alanlarını inceleyin.

Dil, alfabe (isteğe bağlı) ve bölge (isteğe bağlı) Örnekler:
en
fr
en-rUS
fr-rFR
fr-rCA
b+en
b+en+US
b+es+419
b+zh+Hant
b+sr+Latn+RS

Dil, iki harfli ISO 639-1 dil koduyla ve isteğe bağlı olarak ardından iki harfli ISO 3166-1-alpha-2 bölge koduyla (öncesinde küçük harf r) tanımlanır.

Kodlar büyük/küçük harfe duyarlı değildir. r öneki, bölge kısmını ayırt etmek için kullanılır. Tek başına bölge belirtemezsiniz.

Android 7.0 (API düzeyi 24), dile ve bölgeye özgü kaynakları nitelemek için kullanabileceğiniz BCP 47 dil etiketleri desteğini kullanıma sundu. Dil etiketi, bir veya daha fazla alt etiket dizisinden oluşur. Bu alt etiketlerin her biri, genel etiket tarafından tanımlanan dil aralığını hassaslaştırır veya daraltır. Dil etiketleri hakkında daha fazla bilgi için Dilleri Tanımlama Etiketleri konusuna bakın.

BCP 47 dil etiketi kullanmak için b+ ile iki harfli ISO 639-1 dil kodunu birbirine bağlayın ve isteğe bağlı olarak + ile ayrılmış ek alt etiketler ekleyin.

Kullanıcılar sistem ayarlarında dillerini değiştirirse dil etiketi, uygulamanızın ömrü boyunca değişebilir. Bu durumun çalışma zamanında uygulamanızı nasıl etkileyebileceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme bölümüne bakın.

Uygulamanızı diğer dillerde yerelleştirmeye ilişkin eksiksiz bir kılavuz için Uygulamanızı yerelleştirme konusuna bakın.

Ayrıca, tanımlanmış yerel ayarların listesini sağlayan getLocales() yöntemine de bakın. Bu liste birincil yerel ayarı içerir.

Düzen yönü ldrtl
ldltr

Uygulamanızın düzen yönü. ldrtl, "düzen-yönü-sağdan sola" anlamına gelir. ldltr, "layout-direction-left-to-right" anlamına gelir ve varsayılan örtülü değerdir.

Bu; düzenler, çekilebilir öğeler veya değerler gibi herhangi bir kaynak için geçerli olabilir.

Örneğin, Arapça için belirli bir düzen ve Farsça ya da İbranice gibi diğer "sağdan sola" diller için de genel bir düzen sağlamak istiyorsanız aşağıdaki gibi dizinleri kullanabilirsiniz:

res/
  layout/
    main.xml (varsayılan düzen)
  layout-ar/
    main.xml (Arapça için özel düzen)
  layout-ldrtl/
    main.xml ("ar" dil niteleyicisinin daha yüksek bir önceliği olduğu için Arapça dışında sağdan sola yazılan tüm diller)

Not: Uygulamanızda sağdan sola düzen özelliklerini etkinleştirmek için SupportsRtl değerini "true", TargetSdkVersion değerini ise 17 veya daha yüksek bir değere ayarlamanız gerekir.

API düzeyi 17'de eklendi.

En küçük genişlik sw<N>dp

Örnekler:
sw320dp
sw600dp
sw720dp
vb.

Bir uygulama tarafından kullanılabilen ekran alanının en kısa boyutudur. Özellikle, uygulama penceresinin smallestWidth değeri, pencerenin kullanılabilir yüksekliği ve genişliğinden en kısa olanıdır. Bunu, pencere için "mümkün olan en küçük genişlik" olarak da düşünebilirsiniz. Bu niteleyiciyi kullanarak uygulamanızın kullanıcı arayüzü için en az <N> d/sn genişliğe sahip olmasını sağlayabilirsiniz.

Örneğin düzeniniz, ekran alanının en küçük boyutunun her zaman en az 600 dp olmasını gerektiriyorsa bu niteleyiciyi kullanarak bir res/layout-sw600dp/ dizininde düzen kaynakları oluşturabilirsiniz. Sistem, bu kaynakları yalnızca mevcut ekranın en küçük boyutu en az 600 dp olduğunda kullanır. 600 dp olan kenar, kullanıcı tarafından algılanan yükseklik veya genişlikten bağımsızdır. Pencere yeniden boyutlandırıldığında veya mevcut genişlik/yükseklik değiştirilirse ya da yeniden konumlandırılırsa en küçük genişlik değişebilir. Bu da, sistem eklerini değiştirebilir.

Genel ekran boyutunu belirlemek için en küçük genişliği kullanmak yararlıdır. Bunun nedeni, genişliğin genellikle bir düzeni tasarlarken belirleyici faktör olmasıdır. Kullanıcı arayüzü genellikle dikey olarak kaydırılır ancak yatay olarak ihtiyaç duyduğu minimum alanla ilgili oldukça zor kısıtlamalar vardır.

Kullanılabilir genişlik de cep telefonları için tek bölmeli düzenin mi yoksa tabletler için çok bölmeli düzenin mi kullanılacağını belirlemede önemli bir faktördür. Bu nedenle, muhtemelen her cihazda mümkün olan en küçük genişliğin ne olduğuna muhtemelen en çok önem verirsiniz.

Bir cihazın en küçük genişliğinde ekran süslemeleri ve sistem kullanıcı arayüzü dikkate alınır. Örneğin, cihazın ekranda en küçük genişlik ekseni boyunca alanı temsil eden kalıcı kullanıcı arayüzü öğeleri varsa sistem, en küçük genişliğin gerçek ekran boyutundan daha küçük olduğunu bildirir. Bunun nedeni, bu öğelerin kullanıcı arayüzünüz için kullanılamayan ekran pikselleri olmasıdır.

Sık kullanılan ekran boyutları için burada kullanabileceğiniz bazı değerler:

  • Aşağıdakiler gibi ekran yapılandırmaları olan cihazlar için 320:
    • 240x320 ldpi (QVGA cihaz)
    • 320x480 mdpi (cihaz)
    • 480x800 hdpi (yüksek yoğunluklu cihaz)
  • 480x800 mdpi (tablet/cihaz) gibi ekranlar için 480
  • 600, 600x1024 mdpi (7 inç tablet) gibi ekranlar için
  • 720, 720x1280 mdpi (10 inç tablet) gibi ekranlar için

Uygulamanız smallestWidth niteleyicisi için farklı değerlere sahip birden fazla kaynak dizini sağladığında sistem, cihazın smallestWidth değerine en yakın olanı (aşmadan) kullanır.

API düzeyi 13'te eklendi.

Ayrıca, uygulamanızın uyumlu olduğu minimum smallestWidth değerini belirten android:requiresSmallestWidthDp özelliğine ve cihazın smallestWidth değerini barındıran smallestScreenWidthDp yapılandırma alanına da bakın.

Bu niteleyiciyi kullanarak farklı ekranlar için tasarım yapma hakkında daha fazla bilgi için Farklı ekran boyutlarını destekleme bölümüne bakın.

Kullanılabilir genişlik ve yükseklik w<N>dp
h<N>dp

Örnekler:
w720dp
w1024dp
h720dp
h1024dp
vb.

Kaynağın kullanıldığı minimum ekran genişliğini veya yüksekliğini (<N> değeriyle tanımlanan dp birim cinsinden) belirtir. Cihaz yönü dikey veya yatay olarak değiştiğinde, cihaz katlandığında veya açıldığında ya da sistem çoklu pencere moduna girdiğinde veya çıktığında bu yapılandırma değerleri mevcut ekran genişliği ve yüksekliğiyle karşılaştırılır. Çoklu pencere modunda değerler, cihaz ekranının genişliğini ve yüksekliğini değil, uygulamayı içeren pencerenin genişliğini ve yüksekliğini yansıtır. Benzer şekilde, yerleştirilmiş etkinlikler için değerler ekranın genişliği ve yüksekliğiyle değil, her bir etkinliğin genişliği ve yüksekliğiyle ilgilidir. Daha fazla bilgi için Etkinlik yerleştirme konusuna bakın.

Kullanılabilen genişlik ve yükseklik, genellikle çok bölmeli düzenin kullanılıp kullanılmayacağını belirlerken kullanışlıdır. Çünkü bir tablet cihazda bile, dikey yön için genellikle yatay yön için kullandığınız çoklu bölmeli düzeni genellikle yatay yönde kullanmakla istemezsiniz. Böylece, hem ekran boyutu hem de yön niteleyicilerini birlikte kullanmak yerine, düzen için gereken minimum genişliği ve/veya yüksekliği belirtmek amacıyla bunları kullanabilirsiniz.

Uygulamanız bu yapılandırmalar için farklı değerlere sahip birden fazla kaynak dizini sağladığında sistem, cihazın geçerli ekran genişliğine en yakın olanı (aşmadan) kullanır. En yakın değeri, gerçek ekran genişliği ve belirtilen genişlik arasındaki farkın, gerçek ekran yüksekliği ile belirtilen yükseklik arasındaki fark eklenerek belirlenir. Belirtilmemiş yükseklik ve genişlik değeri 0 değerine sahiptir.

Değerler, Pencere eklerinin kapladığı alanı hariç tutar. Bu nedenle, cihazın ekranın kenarlarında kalıcı kullanıcı arayüzü öğeleri varsa genişlik ve yükseklik değerleri, uygulama Window.setDecorFitsSystemWindows veya WindowCompat.setDecorFitsSystemWindows kullanılarak uçtan uca gösterilse bile gerçek ekran boyutlarından daha küçük olur.

Sabit olmayan bazı dikey ekran süslemeleri (ör. tam ekran olduğunda gizlenebilen telefon durum çubuğu) burada hesaba katılmaz. Başlık çubuğu veya işlem çubuğu gibi pencere süslemeleri de söz konusu değildir. Bu nedenle, uygulamaların belirttiğinden biraz daha küçük bir alanı kullanmaya hazırlıklı olması gerekir.

Not: Sistem, hem genişlik hem de yükseklik bakımından eşleşen kaynağı seçer. Bu nedenle, her ikisinin de belirtildiği bir kaynak, yalnızca birini belirten bir kaynak yerine kesinlikle tercih edilir. Örneğin, gerçek ekran 720 dp genişliğinde ve 1.280 dp yüksekliğindeyse ve bir kaynak w720dp ve bir diğeri w700dp-h1200dp olarak nitelendiriliyorsa ilki belirtilenle tam olarak eşleşiyor olsa bile ikincisi seçilir.

API düzeyi 13'te eklendi.

Mevcut ekran genişliğini ve yüksekliğini barındıran screenWidthDp ve screenHeightDp yapılandırma alanlarına da bakın.

Bu niteleyiciyi kullanarak farklı ekranlar için tasarım yapma hakkında daha fazla bilgi için Farklı ekran boyutlarını destekleme bölümüne bakın.

Ekran boyutu small
normal
large
xlarge
  • small: Düşük yoğunluklu QVGA ekranlara benzer boyuta sahip ekranlar. Küçük bir ekran için minimum düzen boyutu yaklaşık 320x426 dp birimdir. QVGA düşük yoğunluk ve VGA yüksek yoğunluk örnekleridir.
  • normal: Orta yoğunluklu HVGA ekranlara benzer boyuta sahip ekranlar. Normal bir ekran için minimum düzen boyutu yaklaşık 320x470 dp birimdir. Bu tür ekranlara örnek olarak WQVGA düşük yoğunluk, HVGA orta yoğunluk ve WVGA yüksek yoğunluk verilebilir.
  • large: Orta yoğunluklu VGA ekranlara benzer boyuta sahip ekranlar. Büyük bir ekran için minimum düzen boyutu yaklaşık 480x640 dp birimdir. VGA ve WVGA orta yoğunluklu ekranlar buna örnek olarak gösterilebilir.
  • xlarge: Geleneksel orta yoğunluklu HVGA ekrandan çok daha büyük olan ekranlar. Xbüyük bir ekran için minimum düzen boyutu yaklaşık 720x960 dp birimdir. Çoğu durumda, ekstra büyük ekranlara sahip cihazlar cebinizde taşınamayacak kadar büyüktür ve büyük olasılıkla tablet tarzı cihazlardır. API düzeyi 9'da eklendi.

Not: Boyut niteleyici kullanmak, kaynakların yalnızca bu boyuttaki ekranlar için olduğu anlamına gelmez. Mevcut cihaz yapılandırmasına daha uygun niteleyicilerle alternatif kaynaklar sağlamazsanız sistem, en uygun kaynakları kullanabilir.

Dikkat: Tüm kaynaklarınızda mevcut ekrandan daha büyük bir boyut niteleyici kullanılıyorsa sistem bu niteleyicileri kullanmaz ve uygulamanız çalışma zamanında kilitlenir. Örneğin, tüm düzen kaynakları xlarge niteleyicisiyle etiketlenmişse ancak cihazın ekranı normal boyuttaysa bu durum gerçekleşir.

API düzeyi 4'te eklendi.

Ayrıca ekranın küçük, normal veya büyük olduğunu belirten screenLayout yapılandırma alanına da bakın.

Daha fazla bilgi için Ekran uyumluluğuna genel bakış konusuna bakın.

Ekran en boy oranı long
notlong
  • long: uzun ekranlar (ör. WQVGA, WVGA, FWVGA)
  • notlong: QVGA, HVGA ve VGA gibi uzun ekranlar için uygun değildir.

API düzeyi 4'te eklendi.

Bu özellik sadece ekranın en boy oranına bağlıdır (long ekranı daha geniştir). Bu, ekran yönüyle ilgili değildir.

Ayrıca, ekranın uzun olup olmadığını belirten screenLayout yapılandırma alanına da bakın.

Yuvarlak ekran round
notround
  • round: yuvarlak ekranlar (ör. yuvarlak giyilebilir cihaz)
  • notround: telefon veya tablet gibi dikdörtgen ekranlar

API düzeyi 23'te eklendi.

Ekranın yuvarlak olup olmadığını belirten isScreenRound() yapılandırma yöntemine de bakın.

Geniş Renk Gamı widecg
nowidecg
  • widecg: Display P3 veya AdobeRGB gibi geniş bir renk gamına sahip ekranlar
  • nowidecg: sRGB gibi dar bir renk gamına sahip ekranlar

API düzeyi 26'da eklendi.

Ekranın geniş bir renk gamına sahip olup olmadığını belirten isScreenWideColorGamut() yapılandırma yöntemine de bakın.

Yüksek Dinamik Aralık (HDR) highdr
lowdr
  • highdr: yüksek dinamik aralık içeren ekranlar
  • lowdr: düşük/standart dinamik aralık içeren ekranlar

API düzeyi 26'da eklendi.

Ekranın HDR özelliklerinin olup olmadığını belirten isScreenHdr() yapılandırma yöntemine de bakın.

Ekran yönü port
land
  • port: Cihaz dikey yönde (dikey)
  • land: Cihaz yatay yönde (yatay)

Kullanıcı ekranı döndürürse uygulamanızın kullanım ömrü boyunca bu değer değişebilir. Bu durumun çalışma zamanında uygulamanızı nasıl etkileyeceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme bölümüne bakın.

Mevcut cihaz yönünü belirten orientation yapılandırma alanına da bakın.

kullanıcı arayüzü modu car
desk
television
appliance
watch
vrheadset
  • car: Cihaz, araç yuvasında gösteriliyor
  • desk: Cihaz bir masa yuvasında görüntüleniyor
  • television: Cihaz televizyonda gösteriliyor ve kullanıcı arayüzünün kullanıcının uzakta olduğu büyük bir ekranda olduğu ve deneyimin temel olarak D-pad veya işaretçi olmayan diğer etkileşimlere odaklandığı "on fitlik" bir deneyim sunuyor
  • appliance: Cihaz, ekran olmadan bir cihaz olarak hizmet veriyor
  • watch: Cihazın ekranı var ve bileğe takılır.
  • vrheadset: Cihaz bir sanal gerçeklik başlığı içinde gösteriliyor

API düzeyi 8'de eklendi; API 13'te televizyon eklendi; izleme API 20'de eklendi.

Cihaz bir yuvaya eklendiğinde veya yuvadan kaldırıldığında uygulamanızın nasıl yanıt verebileceği hakkında bilgi edinmek için Yuvaya yerleştirme durumunu ve türünü belirleme ve izleme başlıklı makaleyi inceleyin.

Kullanıcı cihazı bir yuvaya yerleştirirse bu durum uygulamanızın kullanım ömrü boyunca değişebilir. UiModeManager kullanarak bu modlardan bazılarını etkinleştirebilir veya devre dışı bırakabilirsiniz. Bu durumun çalışma zamanında uygulamanızı nasıl etkileyeceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme bölümüne bakın.

Gece modu night
notnight
  • night: gece
  • notnight: gündüz

API düzeyi 8'de eklendi.

Gece modu otomatik modda (varsayılan) bırakılırsa bu durum uygulamanızın ömrü boyunca değişebilir. Bu durumda mod, günün saatine göre değişir. Bu modu UiModeManager kullanarak etkinleştirebilir veya devre dışı bırakabilirsiniz. Bu durumun çalışma zamanında uygulamanızı nasıl etkileyeceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme bölümüne bakın.

Ekran piksel yoğunluğu (dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnndpi
  • ldpi: düşük yoğunluklu ekranlar; yaklaşık 120 dpi.
  • mdpi: orta yoğunluklu (geleneksel HVGA'da) ekranlar; yaklaşık 160 dpi.
  • hdpi: yüksek yoğunluklu ekranlar; yaklaşık 240 dpi.
  • xhdpi: Ekstra yüksek yoğunluklu ekranlar; yaklaşık 320 dpi. API düzeyi 8'de eklendi.
  • xxhdpi: Ekstra çok yüksek yoğunluklu ekranlar; yaklaşık 480 dpi. API düzeyi 16'ya eklendi.
  • xxxhdpi: Ekstra ekstra yüksek yoğunluklu kullanımlar (yalnızca başlatıcı simgesi; bkz. Farklı piksel yoğunluklarını destekleme); yaklaşık 640 dpi. API düzeyi 18'de eklendi.
  • nodpi: Cihaz yoğunluğuna göre ölçeklendirilmesini istemediğiniz bit eşlem kaynakları için kullanılır.
  • tvdpi: mdpi ile hdpi arasında bir yerde görüntüler; yaklaşık 213 dpi. Bu, "birincil" bir yoğunluk grubu olarak kabul edilmez. Çoğunlukla 720p televizyonlar için tasarlanmıştır ve çoğu uygulama buna ihtiyaç duymaz. 1080p TV panelleri için xhdpi, 4K TV panelleri için xxxhdpi kullanın. API düzeyi 13'te eklendi.
  • anydpi: Tüm ekran yoğunluklarıyla eşleşir ve diğer niteleyicilerden önceliklidir. Bu, vektör çizimleri için yararlıdır. API düzeyi 21'de eklendi.
  • nnndpi: Standart olmayan yoğunlukları temsil etmek için kullanılır. Burada nnn, pozitif bir tam sayı ekran yoğunluğudur. Bu özellik çoğu durumda kullanılmaz. Standart yoğunluklu paketleri kullanmak, pazardaki çeşitli cihaz ekran yoğunluklarını desteklemenin getirdiği yükü büyük ölçüde azaltır.

Altı birincil yoğunluk arasında 3:4:6:8:12:16 ölçeklendirme oranı vardır (tvdpi yoğunluğu göz ardı edilir). Yani ldpi'de 9x9 bit eşlem, mdpi'de 12x12, hdpi'de 18x18, xhdpi'de 24x24 vb.

Not: Yoğunluk niteleyici kullanmak, kaynakların yalnızca bu yoğunluktaki ekranlar için olduğu anlamına gelmez. Mevcut cihaz yapılandırmasıyla daha iyi eşleşen niteleyicilerle alternatif kaynaklar sağlamazsanız sistem, en uygun kaynakları kullanır.

Farklı ekran yoğunluklarının nasıl yönetileceği ve Android'in bit eşlemlerinizi geçerli yoğunluğa uyacak şekilde nasıl ölçeklendirebileceği hakkında daha fazla bilgi edinmek için Ekran uyumluluğuna genel bakış bölümünü inceleyin.

Dokunmatik ekran türü notouch
finger
  • notouch: Cihazın dokunmatik ekranı yok.
  • finger: Cihazda, kullanıcının parmağıyla yön etkileşimiyle kullanılmak üzere tasarlanmış bir dokunmatik ekran vardır.

Ayrıca, cihazdaki dokunmatik ekranın türünü belirten touchscreen yapılandırma alanına da bakın.

Klavye kullanılabilirliği keysexposed
keyshidden
keyssoft
  • keysexposed: Cihazda klavye mevcuttur. Cihazda etkinleştirilmiş bir yazılım klavyesi varsa (muhtemelen) donanım klavyesi kullanıcıya görünmediğinde veya cihazda donanım klavyesi olmadığında bile bu özellik kullanılır. Herhangi bir yazılım klavyesi sağlanmamışsa veya devre dışı bırakılmışsa bu özellik yalnızca donanım klavyesi açık durumdayken kullanılır.
  • keyshidden: Cihazda bir donanım klavyesi var ancak gizli durumda ve cihazda yazılım klavyesi etkin değil.
  • keyssoft: Cihazda, görünür olup olmamasına bakılmaksızın etkin bir yazılım klavyesi bulunuyor.

keysexposed kaynaklarını sağlar ancak keyssoft kaynaklarını sağlamazsanız sistem, yazılım klavyesi etkin olduğu sürece klavyenin görünür olup olmamasına bakılmaksızın keysexposed kaynaklarını kullanır.

Kullanıcı bir donanım klavyesini açarsa bu ayar uygulamanızın kullanım ömrü boyunca değişebilir. Bu durumun çalışma zamanında uygulamanızı nasıl etkileyeceği hakkında bilgi edinmek için Yapılandırma değişikliklerini işleme bölümüne bakın.

Ayrıca, sırasıyla donanım klavyesinin ve her tür klavyenin (yazılım dahil) görünürlüğünü belirten hardKeyboardHidden ve keyboardHidden yapılandırma alanlarına da bakın.

Birincil metin giriş yöntemi nokeys
qwerty
12key
  • nokeys: Cihazda metin girişi için donanım anahtarı yok.
  • qwerty: Cihazda, kullanıcıya görünür olup olmamasına bakılmaksızın bir donanım Q klavyesi bulunur.
  • 12key: Cihazda, kullanıcı tarafından görülebilse de görünmese de 12 tuşlu bir klavye bulunur.

Kullanılabilir birincil metin giriş yöntemini gösteren keyboard yapılandırma alanına da bakın.

Platform sürümü (API düzeyi) Örnekler:
v3
v4
v7
vb.

Cihazın desteklediği API düzeyi. Örneğin, API düzeyi 1 (Android 1.0 veya sonraki sürümlere sahip cihazlar) için v1 ve API düzeyi 4 (Android 1.6 veya sonraki sürümlere sahip cihazlar) için v4 kullanabilirsiniz. Bu değerler hakkında daha fazla bilgi için Android API düzeyleri dokümanına bakın.

Not: Android'in tüm sürümleri tüm niteleyicileri desteklemez. Yeni bir niteleyici kullanmak, eski cihazların bunu görmezden gelmesi için dolaylı yoldan platform sürümü niteleyicisi ekler. Örneğin, kullanılabilir genişlik niteleyicisi API düzeyi 13'te yeni olduğundan w600dp niteleyici kullanıldığında v13 niteleyici otomatik olarak dahil edilir. Herhangi bir sorun yaşamamak için her zaman bir dizi varsayılan kaynak (niteleyici 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.

Niteleyici adı kuralları

Yapılandırma niteleyici adlarını kullanmayla ilgili bazı kuralları burada bulabilirsiniz:

  • Tek bir kaynak grubu için kısa çizgilerle ayrılmış birden çok niteleyici belirtebilirsiniz. Örneğin drawable-en-rUS-land, yatay yönlü ABD İngilizcesi cihazlar için geçerlidir.
  • Niteleyiciler, tablo 2'de listelenen sırada olmalıdır.
    • Yanlış: drawable-hdpi-port/
    • Doğru: drawable-port-hdpi/
  • Alternatif kaynak dizinleri iç içe yerleştirilemez. Örneğin, res/drawable/drawable-en/ kullanamazsınız.
  • Değerler büyük/küçük harfe duyarlı değildir. Kaynak derleyici, büyük/küçük harfe duyarlı olmayan dosya sistemlerinde sorun yaşamamak için işlemden önce dizin adlarını küçük harfe dönüştürür. Adlardaki büyük harf kullanımı, yalnızca okunabilirlik açısından yararlıdır.
  • Her niteleyici türü için yalnızca bir değer desteklenir. Örneğin, İspanya ve Fransa için aynı çekilebilir dosyaları kullanmak isterseniz drawable-es-fr/ adlı bir dizininiz bulunamaz. Bunun yerine, uygun dosyaları içeren drawable-es/ ve drawable-fr/ gibi iki kaynak dizinine ihtiyacınız vardır. Ancak, dosyaları her iki konumda da çoğaltmanız gerekmez. Bunun yerine Takma ad kaynakları oluşturma bölümünde açıklandığı gibi kaynak için takma ad 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. Android, her kaynak isteğinde bulunulduğunda, istenen kaynak dosyasını içeren alternatif kaynak dizinlerini kontrol eder, ardından en uygun kaynağı bulur.

Belirli bir cihaz yapılandırmasıyla eşleşen alternatif kaynaklar yoksa Android, karşılık gelen varsayılan kaynakları (belirli bir kaynak türü için yapılandırma niteleyicisi içermeyen kaynak grubunu) kullanır.

Takma ad kaynakları oluşturun

Birden fazla cihaz yapılandırması için kullanmak istediğiniz bir kaynağınız varsa ancak bu kaynağı varsayılan kaynak olarak sağlamak istemiyorsanız aynı kaynağı birden fazla alternatif kaynak dizinine yerleştirmeniz gerekmez. Bunun yerine, varsayılan kaynak dizininizde kayıtlı bir kaynak için takma ad işlevi gören alternatif bir kaynak oluşturabilirsiniz.

Not: Tüm kaynaklar, başka bir kaynak için takma ad oluşturmanızı sağlayan bir mekanizma sunmaz. Özellikle xml/ dizinindeki animasyon, menü, ham ve belirtilmemiş diğer kaynaklar bu özelliği sunmaz.

Örneğin, icon.png adlı bir uygulama simgenizin olduğunu ve farklı yerel ayarlar için bunun benzersiz bir sürümüne ihtiyacınız olduğunu düşünün. Ancak iki dil için (İngilizce-Kanada ve Fransızca-Kanada) aynı sürüm kullanılmalıdır. Hem İngilizce-Kanada hem de Fransızca-Kanada dili 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) kaydedebilir ve bunu varsayılan res/drawable/ dizinine ekleyebilirsiniz. Ardından, <bitmap> öğesini kullanarak res/drawable-en-rCA/ ve res/drawable-fr-rCA/ öğelerinde icon_ca.png kaynağına referans veren bir icon.xml dosyası oluşturun. Bu, PNG dosyasının yalnızca bir sürümünü ve ona işaret eden iki küçük XML dosyasını depolamanıza olanak tanır. Ayrıntılar için aşağıdaki bölümlerde yer alan örneklere bakın.

Çekilebilir

Mevcut bir çekilebilir öğenin takma adını oluşturmak için <drawable> öğesini kullanın:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="icon">@drawable/icon_ca</drawable>
</resources>

Bu dosyayı res/values-en-rCA/ gibi alternatif bir kaynak dizininde icon.xml olarak kaydederseniz dosya, R.drawable.icon olarak başvurabileceğiniz bir kaynakta derlenir ancak aslında res/drawable/ içine kaydedilen R.drawable.icon_ca kaynağının takma adı olur.

Düzen

Mevcut bir düzenin takma adını oluşturmak için <merge> içine sarmalanmış <include> öğesini kullanın:

<?xml version="1.0" encoding="utf-8"?>
<merge>
    <include layout="@layout/main_ltr"/>
</merge>

Bu dosya main.xml olarak kaydederseniz R.layout.main olarak başvurabileceğiniz bir kaynakta derlenir ancak aslında R.layout.main_ltr kaynağının takma adıdır.

Dizeler ve diğer basit değerler

Mevcut bir dizenin takma adını oluşturmak için yeni dizenin değeri olarak istediğiniz 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 addır.

Diğer basit değerler de aynı şekilde çalışır (ör. 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ığınızda, ilgili kaynağı kaynak kimliğine bakarak uygulayabilirsiniz. Tüm kaynak kimlikleri, projenizin aapt aracının otomatik olarak oluşturduğu R sınıfında tanımlanır.

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ünde bir R alt sınıfı bulunur (ör. tüm çekilebilir kaynaklar için R.drawable). Bu türdeki her kaynak için statik bir tam sayı bulunur. Örneğin, R.drawable.icon. Bu tam sayı, kaynağınızı almak için kullanabileceğiniz kaynak kimliğidir.

Kaynak kimliklerinin belirtildiği yerde R sınıfı olsa da, bir kaynak kimliğini 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, drawable ve layout gibi bir "tür" altında gruplandırılır. Farklı türler hakkında daha fazla bilgi için Kaynak türlerine genel bakış başlıklı makaleyi inceleyin.
  • Kaynak adı. Uzantı hariç dosya adı veya kaynak, dize gibi basit bir değerse XML android:name özelliğindeki değerdir.

Bir kaynağa iki şekilde erişebilirsiniz:

  • Kodda: R sınıfınızın alt sınıfından statik bir tam sayı kullanarak. Örneğin:
    R.string.hello

    string kaynak türü, hello ise kaynak adıdır. Bu biçimde bir kaynak kimliği sağladığınızda kaynaklarınıza erişebilecek birçok Android API vardır. Daha fazla bilgi için Koddaki kaynaklara erişim bölümünü inceleyin.

  • XML'de: R sınıfınızda tanımlanan kaynak kimliğine karşılık gelen özel bir XML söz dizimi kullanın. Örneğin:
    @string/hello

    string kaynak türü, hello ise kaynak adıdır. Bu söz dizimini XML kaynağında, kaynakta sağlamanız beklenen bir değer olan herhangi bir yerde kullanabilirsiniz. Daha fazla bilgi için XML'den kaynaklara erişim bölümüne bakın.

Koddaki kaynaklara erişim

Kaynak kimliğini yöntem parametresi olarak ileterek kod içinde bir kaynak kullanabilirsiniz. Örneğin, setImageResource() ile res/drawable/myimage.png kaynağını kullanacak şekilde 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);

Resources içindeki yöntemleri kullanarak kaynakları da tek tek alabilirsiniz. getResources() ile bu yöntemin bir örneğini alabilirsiniz.

Sözdizimi

Koddaki bir kaynağa referansta bulunmak için kullanılacak söz dizimini burada bulabilirsiniz:

[<package_name>.]R.<resource_type>.<resource_name>
  • <package_name>, kaynağın bulunduğu paketin adıdır (kendi paketinizdeki kaynaklara başvururken gerekli değildir).
  • <resource_type>, kaynak türü için R alt sınıfıdır.
  • <resource_name>, uzantısı olmayan kaynak dosya adıdır veya basit değerler için XML öğesindeki android:name özellik değeridir.

Kaynak türleri ve bunlara nasıl referans verileceği hakkında daha fazla bilgi için Kaynak türlerine genel bakış bölümüne bakın.

Kullanım örnekleri

Kaynak kimliği parametrelerini kabul eden birçok yöntem vardır. Ayrıca Resources içindeki yöntemleri kullanarak kaynakları alabilirsiniz. Context.getResources() kullanarak Resources örneğini alabilirsiniz.

Aşağıda, kod kullanarak kaynaklara erişme hakkında bazı örnekler verilmiştir:

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ı elle değiştirmeyin. Projeniz derlendiğinde aapt aracı tarafından oluşturulur. Bir sonraki derlemenizde değişiklikler geçersiz kılınır.

XML'den kaynaklara erişim

Mevcut bir kaynağa yapılan referansı kullanarak bazı XML özellikleri ve öğeleri için değerler tanımlayabilirsiniz. Bunu 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 bir Button eklerseniz düğme metni için bir dize kaynağı kullanın:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

Sözdizimi

XML kaynağındaki bir kaynağa referans vermek için kullanılacak söz dizimini burada görebilirsiniz:

@[<package_name>:]<resource_type>/<resource_name>
  • <package_name>, kaynağın bulunduğu paketin adıdır (aynı paketteki kaynaklara başvururken gerekli değildir).
  • <resource_type>, kaynak türünün R alt sınıfıdır.
  • <resource_name>, uzantısı olmayan kaynak dosya adıdır veya basit değerler için XML öğesindeki android:name özellik değeridir.

Kaynak türleri ve bunlara nasıl referans verileceği hakkında daha fazla bilgi için Kaynak türlerine genel bakış bölümüne bakın.

Kullanım örnekleri

Bazı durumlarda, bir widget'a çekilebilir resim uygulamak gibi XML'de bir değer için kaynak kullanmanız gerekir. Ancak XML'de, basit bir değeri kabul eden her yerde bir kaynak da kullanabilirsiniz. Örneğin, bir 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 geldiğinden 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 diller için yerelleştirilebilmesi amacıyla her zaman dize kaynaklarını kullanın. Alternatif kaynaklar (yerelleştirilmiş dizeler gibi) oluşturma hakkında bilgi için Alternatif kaynaklar sağlama bölümüne bakın. Uygulamanızı diğer dillerde yerelleştirme hakkında eksiksiz bir kılavuz için Uygulamanızı yerelleştirme bölümüne bakın.

Takma ad oluşturmak için XML'deki kaynakları bile kullanabilirsiniz. Örneğin, başka bir çekilebilir kaynağın takma adı olan bir çekilebilir 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 yöntem gereksiz görünse de alternatif kaynak kullanırken çok faydalı olabilir. Daha fazla bilgi edinmek için takma ad kaynakları oluşturma hakkındaki bölüme bakın.

Referans stili özellikleri

Stil özelliği kaynağı, halihazırda uygulanan temadaki bir özelliğin değerine referans vermenizi sağlar. Stil özelliğine referans vermek, sabit kodlu bir değer sağlamak yerine, kullanıcı arayüzü öğelerinin görünümünü mevcut temanın sağladığı standart varyasyonlarla eşleşecek şekilde biçimlendirerek özelleştirmenize olanak tanır. Bir stil özelliğine referansta bulunulduğunda "Bu özellik tarafından tanımlanan stili mevcut temada 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ın. Kaynak türü bölümü isteğe bağlıdır. 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 şu şekilde başvurabilirsiniz:

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

Buradaki android:textColor özelliği, geçerli temadaki bir stil özelliğinin adını belirtir. Android artık bu widget'ta android:textColor değeri olarak android:textColorSecondary stili özelliğine uygulanan değeri kullanıyor. Sistem kaynağı aracı bu bağlamda bir özellik kaynağının beklendiğini bildiğinden türü (?android:attr/textColorSecondary) açıkça belirtmeniz gerekmez. attr türünü hariç tutabilirsiniz.

Orijinal dosyalara erişme

Çok sık karşılaşılmasa da orijinal dosya ve dizinlerinize erişmeniz gerekebilir. Bu durumda dosyalarınızı res/ hizmetine kaydetmeniz işe yaramaz. Çünkü res/ ürününden kaynak okumanın tek yolu kaynak kimliğiyledir. Bunun yerine kaynaklarınızı assets/ dizinine kaydedebilirsiniz.

assets/ dizinine kaydedilen dosyalara kaynak kimliği verilmediğinden R sınıfı veya XML kaynakları aracılığıyla bu dosyalara başvuruda bulunamazsınız. Bunun yerine, assets/ dizinindeki dosyaları normal bir dosya sistemi gibi sorgulayabilir ve ham verileri AssetManager kullanarak okuyabilirsiniz.

Ancak tüm ihtiyacınız olan ham verileri (video veya ses dosyası gibi) okuyabilmekse, dosyayı res/raw/ dizinine kaydedin ve openRawResource() kullanarak baytlardan oluşan bir akışı okuyun.

Platform kaynaklarına erişim

Android'de stiller, temalar ve düzenler gibi çeşitli standart kaynaklar bulunur. 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 düzen kaynağıdır. Liste öğeleri için kendi düzeninizi oluşturmak yerine bunu kullanabilirsiniz.

Kaynaklarla en iyi cihaz uyumluluğunu sağlayın

Uygulamanızın birden fazla cihaz yapılandırmalarını desteklemesi açısından, 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 dil ve bölge niteleyicisi olmadan her zaman bir values/ dizini ekleyin (dizelerinizin kaydedildiği yer). 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ış bir cihazda çalıştırıldığında kilitlenir.

Varsayılan values/ kaynaklarını sağladığınız sürece, kullanıcılar sunulan dili anlamasa bile uygulamanız düzgün şekilde çalışır. Kilitlenmekten iyidir.

Benzer şekilde, ekran yönüne göre farklı düzen kaynakları sağlarsanız varsayılan olarak bir yön seçin. Örneğin, yatay için layout-land/ ve dikey için layout-port/ düzen kaynaklarını sağlamak yerine, birini varsayılan değer (ör. yatay için layout/ ve dikey için layout-port/) bırakın.

Varsayılan kaynaklar sağlamak yalnızca uygulamanızın beklemediğiniz bir yapılandırmada çalışabileceği için değil, aynı zamanda Android'in yeni sürümlerinin bazen eski sürümlerin desteklemediği yapılandırma niteleyicileri eklediği için de önemlidir. Yeni bir kaynak niteleyici kullanıyor ancak Android'in eski sürümleriyle kod uyumluluğunu sürdürüyorsanız Android'in eski bir sürümü uygulamanızı çalıştırdığında, varsayılan kaynakları sağlamazsanız uygulamanız kilitlenir. Bunun nedeni, yeni niteleyicinin adını taşıyan kaynakları kullanamamasıdır.

Örneğin, minSdkVersion 4 olarak ayarlanırsa ve tüm çekilebilir kaynaklarınızı gece modunu (API düzeyi 8'de eklenmiş olan night veya notnight) kullanarak gerekli kılarsanız API düzeyi 4 cihaz, çekilebilir kaynaklarınıza ve kilitlenmelerinize erişemez. Bu durumda, muhtemelen notnight kaynağının varsayılan kaynaklarınız olmasını istersiniz. Dolayısıyla bu niteleyiciyi hariç tutun ve çekilebilir kaynaklarınızı drawable/ veya drawable-night/ içine yerleştirin.

Kısacası, en iyi cihaz uyumluluğunu sağlamak amacıyla 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 büyükse ekran yoğunluğu niteleyicisiyle alternatif çekilebilir kaynaklar sağladığınızda varsayılan çekilebilir kaynaklara ihtiyacınız yoktur. Varsayılan çekilebilir kaynaklar olmasa bile Android, alternatif ekran yoğunlukları arasında en iyi eşleşmeyi bulabilir ve bit eşlemleri gerektiği şekilde ölçeklendirebilir. Ancak her tür cihazda en iyi deneyimi sunabilmek için üç yoğunluk türü için de alternatif çekilebilir kaynaklar sağlayın.

Android en iyi eşleşen kaynağı nasıl bulur?

Alternatifler sağladığınız bir kaynak isteğinde bulunduğunuzda Android, geçerli 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 çekilebilir dizinlerin 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/

Cihaz yapılandırmasının aşağıdaki gibi olduğunu varsayın:

Yerel ayar = en-GB
Ekran yönü = port
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-port kaynağından çekilebilir kaynakları seçer.

Sistem, aşağıdaki mantıkla hangi kaynakların kullanılacağına karar verir:

2. Şekil. Android'in en iyi eşleşen kaynağı nasıl bulduğunu gösteren akış şeması.

  1. Cihaz yapılandırmasıyla çelişen kaynak dosyaları kaldırın.

    drawable-fr-rCA/ dizini, en-GB yerel ayarıyla çeliştiği için çıkarılır.

    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, bir çelişki nedeniyle devre dışı bırakılamayan tek niteleyicidir. Cihazın ekran yoğunluğu hdpi olsa bile drawable-port-ldpi/, bu noktada her ekran yoğunluğunun eşleşme olarak kabul edildiği için çıkarılmaz. Daha fazla bilgi için Ekran uyumluluğuna genel bakış başlıklı makaleye bakın.

  2. Listede sonraki en yüksek öncelik niteleyicisini bulun (tablo 2). (MM ile başlayın.)
  3. Kaynak dizinlerinden herhangi biri bu niteleyiciyi içeriyor mu?
    • Hayır ise ikinci adıma dönün ve bir sonraki niteleyiciye bakın. Bu örnekte, dil niteleyicisine ulaşılana kadar yanıt "hayır"dır.
    • Yanıtınız evet ise dördüncü adıma geçin.
  4. Bu niteleyiciyi içermeyen kaynak dizinlerini kaldırın. Bu örnekte sistem daha sonra dil niteleyicisi içermeyen tüm dizinleri eler:
    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ğu ise Android, cihazın ekran yoğunluğuna en yakın seçeneği belirler. Genel olarak Android, daha küçük bir orijinal resmin ölçeğini küçültmeyi tercih eder. Daha fazla bilgi için Ekran uyumluluğuna genel bakış konusuna bakın.

  5. Yalnızca bir dizin kalana kadar ikinci, üçüncü ve dördüncü adımı tekrarlayın. Bu örnekte, ekran yönü eşleşmelerin bulunduğu bir sonraki niteleyicidir. 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, bunun bazı yönlerini optimize eder. Bu optimizasyonlardan biri, cihaz yapılandırması öğrenildiğinde, hiçbir zaman eşleşmeyen alternatif kaynakların ortadan kaldırılmasıdır. Örneğin, yapılandırma dili İngilizceyse dil niteleyicisi İngilizce dışında bir değere ayarlanmış herhangi bir kaynak dizin, işaretlenen kaynak havuzuna hiçbir zaman dahil edilmez (bununla birlikte, dil niteleyicisi olmayan bir kaynak dizin yine de dahil edilir).

Kaynakları ekran boyutu niteleyicilerine göre seçerken sistem, 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 ekran, gerekirse normal boyutlu ekran kaynaklarını kullanır.

Ancak mevcut kaynaklardan büyük olan kaynaklar sistem tarafından kullanılmaz ve cihaz yapılandırmasıyla eşleşen başka kaynak yoksa uygulamanız kilitlenir. Örneğin, tüm düzen kaynakları xlarge niteleyicisiyle etiketlenmişse ancak cihaz normal boyutta bir ekransa bu durum gerçekleşir.

Not: Niteleyicinin önceliği (2. tabloda), cihazla tam olarak eşleşen niteleyici sayısından daha önemlidir. Yukarıdaki örnekte, dördüncü adımda, listedeki son seçenekte cihazla tam olarak eşleşen üç niteleyici bulunur (yön, dokunmatik ekran türü ve giriş yöntemi), drawable-en ise (dil) ile eşleşen yalnızca bir parametreye sahiptir. Bununla birlikte, dil bu diğer niteleyicilerden daha yüksek önceliğe sahiptir, bu nedenle drawable-port-notouch-12key elenir.