Farklı Android Cihazları Desteklemek

Farklı Android Cihazları Desteklemek


Android cihazlar dünya üzerinde farklı sürüm ve boyutlarda bulunmaktadır. Uygulamanızın daha geniş kitlelere ulaşmasını istiyorsanız bu geniş Android dünyasını olabildiğince fazla desteklemelisiniz. Farklı boyut, sürüm ve dil destekleri uygulamanızın kullanıcı sayısını arttıracaktır. 
Bu eğitimde size temel anlamda platformun özelliklerini nasıl kullanılacağınızı, kullanıcı deneyimini her kullanıcı grubu için tek bir uygulama paketi (APK) üzerinden nasıl yüksek tutacağınızı göstereceğiz.

Farklı Dilleri Desteklemek

Kullanıcı arayüzündeki metinsel ifadeleri kodunuzdan ayırmanız ve harici bir dosya içinde tutmanız her zaman faydalı olacaktır. Android bu işlemi resource klasörünü kullanarak kolayca halletmektedir. 
Uygulamanızı oluştururken Android SDK araçlarını kullanıyorsanız, araçlar projenizin en tepesinde bir res/ klasörü oluşturur. Res klasörü birçok değişik kaynak (resource) türüne göre alt klasörler barındırır. Bunun yanında res/values/strings.xml gibi varsayılan olarak oluşturulan string değerlerini tutan dosyalar bulunur.
Dile Uygun Dizinleri Oluşturmak ve String Dosyaları
Daha çok dile destek vermek için res klasörünün altına fazladan values klasörü oluşturup klasör isminin yanına - (tire) ile birlikte ülkelerin ISO dil kodlarını eklemeniz gereklidir. Örneğin uygulamada Rusça dil desteği vermek için oluşturulması gereken klasör values-ru şeklinde olacaktır. Android, kullanıcının dil ayarlarına göre hangisini kullanacağını belirleyecektir.
Desteklemek istediğiniz dillerle ilgili çalışma yapmak istediğinizde oluşturmanız gereken klasör yapısı aşağıdadır.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>
İspanyolca için /values-es/string.xml dosyası:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>
Fransızca için /values-fr/strings.xml dosyası:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mon Application</string>
    <string name="hello_world">Bonjour le monde !</string>
</resources>
NOT: Bu "-fr", "-es" gibi son eklere eleyici (qualifier) denir. Bu dil eleyicileri her türlü kaynak (resource) tipinde kullanabilirsiniz. Örneğin drawable dizininde de kullanabilirsiniz ve böylece farklı dillere göre farklı görseller gösterebilirsiniz.

String Kaynaklarını Kullanmak

String kaynaklarınıza  Java kaynak kodunuzda veya diğer XML dosyalarınızda referans gösterebilmek için onun ismini kullanabilirsiniz. İsmi <string> elementini tanımlarken kullandığınız name özniteliğinde verirsiniz.
Kaynak kodu tarafında R.string.<string_name> söz dizimini kullanarak string kaynağına referans verebilirsiniz. String kaynakları alabileceğiniz farklı metotlar aşağıda gösterilmiştir:
// Uygulamanı kaynaklarından (Resources [0]) yararlanalım
String hello = getResources().getString(R.string.hello_world);

//veya string isteyen bir metotda doğrudan string kaynağımızı verelim
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);
Diğer XML dosyalarındayken string kaynağınızı referans göstermek için @string/<string_name>  söz dizimini kullanabilirsiniz. Unutmayınız ki ancak string kabul eden öznitelikler için böyle bir referans gösterebilirsiniz.
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

Farklı Ekran Boyutlarını Desteklemek

Android, cihaz ekranlarını 2 temel özelliğe göre sınıflandırıyor: ekran boyutu ve ekran yoğunluğu (density). Farklı boyut ve yoğunlukta ekranı olan cihazlara kurulacak uygulamanızdan da bu değişkenliğe uymasını sağlamalısınız. Bu amaçla, farklı ekran boyutu ve yoğunlukları olan cihazlarda, uygulamanızın görünümünü optimize edecek bazı "alternatif kaynakları" (alternative resources) uygulamanıza dahil etmelisiniz.
  • 4 boyut sınıflandırması vardır: smallnormallargexlarge
  • 8 ekran yoğunluğu sınıflandırması vardır. low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi), extra extra high (xxhdpi), extra extra extra high (xxxhdpi), nodpitvdpi.
Farklı ekranlarda kullanmak istediğiniz layout'ları ve bitmap'leri "alternatif kaynaklar" olarak beyan etmek istediğinizde onları mutlaka ayrı dizinler içinde (tıpkı farklı dil string'lerinde yaptığınız gibi) tutmalısınız.
Ekran oryantasyonunu (yatay-landspace ya da dikey-portrait) göz önünde bulundurmak, ekran boyutu çeşitliliğini dikkate almayı gerektirir ki bu sebeple uygulamalar, her oryantasyondaki kullanıcı deneyimini optimize etmek için layout'larını gözden geçirmelidir.

Farklı Layout'lar Oluşturmak

Farklı cihaz boyutları üzerinde kullanıcı deneyimini optimize etmek için desteklemek istediğiniz her ekran boyutuna özel XML dosyasını oluşturmanız gerekir. Her layout dosyası, kendisine tahsis edilen bir klasörde kaydedilmeli ve klasör ismi -<screen-size> son eki içermelidir. Örneğin geniş (large) ekranlarda layout dizini res/layout-large/ saklanmalıdır. 
NOT: Android, layout dosyalarınızı otomatik olarak ekrana sığacak şekilde ölçeklendirir. Bu nedenle arayüz elementleri (düğme, metin kutusu vs.) gibi sabit boyutlu elemanların farklı ekran boyutlarındaki durumuna mesai harcamak yerine, kullanıcı deneyimini etkileyen layout yapısı (örneğin içindeki view'lar yerine önemli view'ların (RelativeLayout gibi) konumu ve boyutu gibi) üzerine düşünmeyi deneyebilirsiniz.
Aşağıdaki projede varsayılan bir layout kaynağı ve geniş (large) ekranlar için alternatif bir layout kaynağının yapısını görüyorsunuz:
@Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
}
Sistem, uygulamanızın çalıştığı cihazın ekran boyutuna göre isimlendirilmiş uygun layout dizininden layout dosyasını alır ve ekranda gösterir. Android'in buradaki "ekran boyutuna göre" yaptığı seçimi hakkında daha fazla bilgi almak için Kaynakları Sağlamak (Providing Resources) rehberini okuyabilirsiniz.
Bir başka örnek: Yatay (landspace) oryanstasyona göre alternatif kaynak sağlayan bir projenin yapısı:
MyProject/
    res/
        layout/
            activity_main.xml
        layout-land/
            activity_main.xml
Varsayılan olarak dikey oryantasyonda layout/activity_main.xml dosyası kullanılır.
Eğer uygulamanızda yatay oryantasyonlar için -geniş ekranları da desteklemek koşuluyla- özel bir layout sağlamak istiyorsanız large ve land eleyicilerinin ikisini birden kullanmanız gerekir:
MyProject/
    res/
        layout/              # varsayılan (dikey oryantasyon)
            activity_main.xml
        layout-land/         # yatay oryantasyon
            activity_main.xml
        layout-large/        # büyük ekran (dikey oryantasyon)
            activity_main.xml
        layout-large-land/   # büyük ekran (yatay oryantasyon)
            activity_main.xml
NOT: Android 3.2 ve üstündeki sürümler, ekran boyutlarını tanımlamaya yarayan ileri seviye yöntemler sağlar. Bu sayede yoğunluk-bağımsız (density-independent) piksel (dpi) cinsinden ifade edilen minimum genişlik ve yükseklik değerleriyle, ekran boyutu temelinde alternatif kaynaklar tanımlayabilirsiniz. Bu eğitim içeriği bu konuda değinmeyecektir. Daha fazlasını öğrenmek isterseniz Birden Fazla Ekran için Tasarlamak (Designing for Multiple Screens) belgesine bakabilirsiniz.

Farklı Bitmap'ler Oluşturmak

Her zaman, şu ekran yoğunluklarına özel olarak oranlanmış bitmap kaynaklarını sağlıyor olmalısınız: düşük (low), orta (medium), yüksek (high) ve ekstra-yüksek (extra-high) yoğunluk. Böyle yaparak tüm ekran yoğunluklarında iyi bir grafik kalitesine ve performansa ulaşabilirsiniz.
Bu gibi görselleri oluşturabilmek için vektör biçiminde bir ham (raw) kaynak ile başlamalı ve şuradaki boyut oranlarını kullanarak her yoğunluk için görselleri oluşturmalısınız:
  • xhdpi: 2.0
  • hdpi: 1.5
  • mdpi: 1.0 (taban burası)
  • ldpi: 0.75
Bunun anlamı eğer xhdpi cihazlar için 200'e 200 bir görsel oluşturacaksanız, mdpi için 150x150, ldpi için 75x75'lik boyutlarında hazırlamalısınız.
Ardından bu dosyaları uygun drawable resource dosyaları altına kaydetmelisiniz: 
MyProject/
    res/
        drawable-xhdpi/
            profil.png
        drawable-hdpi/
            profil.png
        drawable-mdpi/
            profil.png
        drawable-ldpi/
            profil.png
Uygulamanızda istediğiniz yerde @drawable/profil referansını kullanabilirsiniz. Buna göre sistem uygun yoğunluk oranına göre ilgili bitmap dosyasını seçecektir.
NOT: Düşük çözünürlüklü (ldpi) kaynaklar her zaman gerekli değildir. hdpi bir görsel/kaynak sağladığınızda sistem, ldpi ekranlara uyacak şekilde oranlayacaktır.

Farklı Android Sürümlerini Desteklemek

Android'in yeni sürümlerindeki API'ler uygulamanız için nadide özellikler sunarken, daha fazla cihaz güncellenene kadar Android'in eski sürümlerini destekleyemeye de devam etmelisiniz. Bu eğitim içeriği size, eski sürümleri desteklemeyi bırakmadan en son API'lerin üstünlüklerini de nasıl kullanacağınızı göstermeyi hedefliyor.
Platform versiyonlarının yer aldığı, Google Play Store'u ziyaret eden cihazlardan alınan bilgilerle düzenli olarak güncellenen şu sayfadan Android sürüm dağılımını görebilirsiniz.

Öneri: Farklı Android sürümlerinde işlevselliği ve en iyi özellikleri sağlamaya devam etmek için eski sürümlerde farklı son platform API'lerini kullanmanızı sağlayan Android Destekleme Kütüphanesi (Support Library) kullanmalısınız. 

En Düşük ve Hedeflenen Sürüm Seviyesinin Belirlenmesi

AndroidManifest.xml dosyası, uygulamanızın hangi sürümler için çalışacağını ve uygulamanızın çeşitli detaylarını tanımlar. Manifest dosyasında yer alan <uses-sdk
/> elementinde minSdkVersion ve targetSdkVersion öznitelikleri sayesinde, uygulamanızın çalışacağı en düşük API seviyesini ve uyumlu API seviyesini belirlersiniz. En yüksek API seviyesi genelde uygulamanızı tasarlayıp test ettiğiniz seviyeyi ifade eder.
Örnek:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
    ...
</manifest>
Android'in yeni bir sürümü yayınlandığında, bazı stiller ve davranışlar değişebilir. Bu değişiklerin uygulamanızda yer alması ve her kullanıcının cihazına uyması için targetSdkVersion değerini en son sürüm ile belirtmeniz iyi olacaktır.

Çalışma Zamanında Sistem Sürümünü Kontrol Etmek

Android, her platform sürümü için eşsiz (unique) bir kod adı sağlar ve bu kod adı, sabitlerden oluşan Build isimli bir sınıf sayesinde sağlanır. Uygulamanızı çalıştıracağınız sistemin sürümüne bu kod adı yardımıyla bakarak, o sürümde çalıştırabileceğiniz en uygun kodu işleme koyabilirsiniz. Örneğin uygulamanızla sadece Android 3.0 üzerindeki bir sistemde çalışıyorsa ActionBar göstermek isteyebilirsiniz:
private void setUpActionBar() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}
NOT: Android, XML kaynaklarını ayrıştırırken o anki cihaz tarafından desteklenmeyen XML özniteliklerini (attribute) göz ardı eder. Bu yüzden, eski sürümlerin böyle kodlar gördüğünde es geçiyor olmasına kulak asmayıp, sadece yeni sürümler tarafından desteklenen XML özniteliklerini kullanabilirsiniz. Örneğin targetSdkVersion="11" tanımlamasını yaptıysanız, Android 3.0 ve üzerinde çalışan uygulamanıza varsayılan olarak ActionBar dahil edilecektir. Menü öğelerini Action Bar'a eklemek için de XML menü kaynağı dosyanızda ilgili menü öğesine android:showAsAction="ifRoom" ayarlamasını yapmanız gerekir. Bu ayarlamanın, sadece onu destekleyen Android sürümüne yönelik XML dosyasında (örneğin sadece res/menu-v11/ dizininde) yapılması daha doğru olacaktır. Çünkü eski Android sürümleri kolayca showAsAction özniteliğini es geçer.

Platformun Stil ve Temalarını Kullanmak

Android, kullanıcı deneyimini arttırmak için kendi temasını baz alan, sistem temasına benzeyen temalar sağlamaktadır. Bu temaları uygulamanızın manifest dosyasına ekleme yaparak kullanabilirsiniz. Yerleşik gelen bu stil ve temaları kullanarak uygulamanızın her yeni Android dağıtımıyla birlikte güncel ve doğal görünümü takip etmesini sağlayabilirsiniz:
Activity'nizin diyalog kutuları gibi olması için Activity temasına şunu eklemelisiniz:
<activity android:theme="@android:style/Theme.Dialog">
Activity'nizin arkaplanının transparan olması için:,
<activity android:theme="@android:style/Theme.Translucent">

Kendi özel temanızı /res/values/styles.xml içinde oluşturmak için:
<activity android:theme="@style/CustomTheme">

Temayı uygulamanızın tamamında kullanmak için <application> elemanının android:theme özniteliğinde yapmanız gereken değişiklik ise şöyle:
<application android:theme="@style/CustomTheme">


Yorumlar

Yorum Gönder

Bu blogdaki popüler yayınlar

İç İçe Döngüler

CSS Bir Elemanın Genişliği ve Yüksekliği

JavaScript Dilinde Fonksiyon Çağırma Teknikleri