Sunday, March 20, 2011

Android Uygulama Kaynakları

Android'in kaynakları yönetimi, uygulama geliştirmeye yeni başlayanlar için karmaşık olabilir. Android platformu üzerinde başarılı uygulamalar geliştirmeyi hedefliyorsak aşağıdaki nedenlerden dolayı Android'in kaynak yönetim yapısını iyi bilmemiz gerekiyor.

  • Uygulama, farklı ekran çözünürlüklerindeki cihazları destekleyebilirse, potansiyel kullanıcı sayısı artmış olur.
  • Türkçe uygulama geliştirmek çok güzel fakat, kullanıcı sayısını binlerden yüzbinlere çıkartmak için farklı dilleri desteklemek şart.
  • Uygulama bileşenlerinin (View) ekrandaki dizilimini (layout) zaten karmaşık olan java kodundan ayırmak kodun okunabilirliğini arttırır.
  • Telefonun dikey ve yatay duruşu (screen orientation) için farklı bileşen dizilimleri kullanmak isteyebiliriz.
  • Kullanıcıların uygulumayı özelleştirebilmesi için farklı stiller (renkler, ikonlar) desteklememiz gerekebilir.

Eclipse ile bir Android uygulamasını oluşturduğumuzda resimdeki gibi 4 ana klasör görürüz.


  • src dizininden bahsetmeye gerek yok. Yazdığımız tüm java kodları bu dizin altında paketler içerisinde bulunuyor.
  • gen dizininde aapt (Android Asset Packaging Tool) tarafından oluşturulan ve uygulama kaynaklarına src altındaki java kodundan erişimi sağlayan meşhur R.java sınıfı yer alır. Eclipse ile uygulama geliştirenlerin aapt'yi kullanmalarına gerek yok. Eclipse yeni tanımlanan kaynakları algılayıp R.java sınıfını otomatik güncelleyecektir.
  • assets dizini başka bir yazının konusu olabilir ama kısaca ne amaçla kullanıldığından bahsedelim. Bu dizin altındaki dosyalara sadece java.io.InputStream aracılığı ile erişilebiliyor. mp3 dosyaları, pdf'ler, csv formatındaki data dosyalarını bu dizin altına atıp InputStream aracılığı ile okuyabiliriz.
  • res dizini bu yazının konusu olan dizinimiz. Tüm uygulama kaynaklarımız bu dizin altına koyuluyor.
res dizini altında yer alan kaynak dosyalarından bahsetmeye en kolayından ve en çok kullanılanından başlayalım.

strings.xml

res/values dizini altında tanımlayabileceğimiz kaynaklar arasında en fazla kullanılanı strings.xml'dir. Uygulama içerisinde geçen tüm metinleri strings.xml dosyasına kaydedip java kodu içinden R sınıfı aracılığı ile erişebiliriz. Aşağıda örnek bir strings.xml dosyası ve buradaki metinlere java kodundan nasıl erişildiği gösteriliyor. strings.xml dosyasında sabit metinler dışında değişkenler de tanımlanabilir. Değişken tanımlarken java.util.Formatter sayfasında anlatılan kurallara uyulması bekleniyor.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="karsilama_mesaji">Merhaba dünyalı. Biz dostuz.</string>
    <string name="karsilama_mesaji_ozel">Merhaba %1$s. Biz dostuz.</string>
</resources>
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   TextView ozelMesaj = (TextView)findViewById(R.id.textView_karsilama_ozel);
   ozelMesaj.setText(getString(R.string.karsilama_mesaji_ozel, "ilkin"));
}
Telefonlarının yerel dil ayarı "FR" olan kullanıcılar için uygulamaya fransızca desteği eklemek istersek, strings.xml dosyasının bir kopyasını olusturup Türkçe metinleri Fransızca karşılıkları ile değiştirmemiz gerekir. Örnek fransızca strings.xml dosyası aşağıdaki gibidir. (google translate sağolsun)
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="karsilama_mesaji">Bonjour terriens. Nous sommes des amis.</string>
    <string name="karsilama_mesaji_ozel">Bonjour %1$s. Nous sommes des amis.</string>
</resources>

Metinlerin fransızca karşılıklarını içeren strings.xml dosyasını aşağıdaki şekildeki gibi res/values-fr dizini altına koymamız gerekiyor. Dili Fransızca olan telefonlarda metinlerin Fransızca karşılıklarını gösterme işini Android platformu bizim için yapacaktır.

Vakit bulursam bir sonraki yazının konusu drawable kaynaklar (renkler, resimler, ikonlar) olacak. Bol Android'li günler :)