R etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
R etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

8 Nisan 2012 Pazar

Farklı projelerde JAR library'de tanımlanmış android resource dosyalarını kullanmak

Merhaba, uzun bir aradan sonra yeni bir makaleyle tekrar beraberiz. Başlık biraz garip oldu ama anlatmak istediğim şeyi daha farklı nasıl yazarım bilemedim. Problemimiz şu: Farklı projelerde kullanmak amacıyla kendi library'inizi (jar dosyanızı) oluşturduğunuzu varsayalım. Eğer paket içinde herhangi bir android resource dosyası mevcutsa maalesef bu kütüphaneyi import ettiğinizde hata ile karşılaşacaksınız. Bunun nedeni resource dosyalarının final static olarak tanımlanması ve her projenin "R"esource'unun diğerlerinden farklı olmasından kaynaklanmaktadır. Hemen basit bir örnek.

Diyelim ki kütüphanenizde showToast adinda kendinize özel geliştirdiğiniz bir method var. Bu method adından da anlaşılacağı üzere kullanıcıya mesaj vermek için oluşturduğunuz bir method. Gösterilen mesajda öyleya sadece strings.xml resource'unda tanımlı MESAJ_DESC adındaki parametreye ne tanımlanmışsa onu gösteriyor diyelim. Doğal olarak istediğiniz şey, bu kütüphaneyi kullandığınız her projede strings.xml'deki MESAJ_DESC parametresini özelleştirebilmek olacak. Ancak MESAJ_DESC parametresinin ID'sinde bulunan değer, kütüphanenin oluşturulduğu projenin Resource dosyasında neyse her zaman o olacağından uygulama MESAJ_DESC parametresini bulamayacak, hata verecek ve bu library'i kullanamayacaksınız. İşte bu gibi durumlarda aşağıdaki method ile bu problemin önüne geçmeniz mümkün.
public static int getResourceIdByName(String packageName, String className, String name) {
   Class r = null;
   int id = 0;
try {
    r = Class.forName(packageName + ".R");

    Class[] classes = r.getClasses();
    Class desireClass = null;

    for (int i = 0; i < classes.length; i++) {
        if(classes[i].getName().split("\\$")[1].equals(className)) {
            desireClass = classes[i];

            break;
        }
    }

    if(desireClass != null)
        id = desireClass.getField(name).getInt(desireClass);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (SecurityException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}
return id;
}
Kullanımı için
int id = getResourceIdByName(context.getPackageName(), "string", "showToast");
(Kaynak: http://stackoverflow.com/questions/1995004/packaging-android-resource-files-within-a-distributable-jar-file)

25 Mayıs 2011 Çarşamba

Android Serisi 3. Bölüm - Values klasörü ve Localization

Arkadaşlar merhaba, android serisinin üçüncü bölümüyle tekrar beraberiz. İsterseniz hiç uzatmadan direk values klasörünün ne işe yaradığını belirterek başlayalım. Özetle values klasörü string sabitlerden oluşan xml dosyaları içerir. Genelde localization ve başka nesnelere yeni değerler atamak amacıyla kullanılır. Localization'ı zaten birlikte yapacağız ancak başka nesnelere yeni değer atamak cümlesiyle neyi kastediyoruz onu kısaca açıklayalım.

Mesela resource'a kendi yaptığınız renk kodunu ekleyebilirsiniz. Values klasörüne colors.xml adıyla yeni bir Android XML dosyası oluşturup aşağıdaki kodu içerisine kaydedin.

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="baslik">#AAFFFF99</color>
<color name="satir_1">#FF0000FF</color>
<color name="satir_2">#90FF0000</color>
<color name="uyari">#AA0000FF</color>
</resources>

Artık bu color elemanlarını name tag'inde atadığınız değere göre kullanmanız için hiçbir engel yok. R.color.baslik şeklinde çağırmanız yeterli.

LOCALIZATION

2. bölümde yapmış olduğumuz örnek uygulamayla devam edelim. Orada hardcoded eklediğimiz bölümleri dinamikleştirmiş olacağız. Bunun için values klasöründe aşağıdaki gibi yeni bir android.xml dosyası oluşturun.



Not: Benim emulatörümde türkçe dil desteği olmadığından dolayı -ki büyük ihtimal sizinkinde de olmayacaktır- fransızca'ya göre ayarlama yapıyor olacağım.

şimdi values klasörümüz içindeki string.xml dosyasını açıp içini aşağıdaki gibi değiştiriyoruz.

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Our Android Programme!</string>
<string name="app_name">Sample App Login Screen</string>
<string name="lblUsername">Username: </string>
<string name="lblPassword">Password: </string>
<string name="lblBtnGiris">Login</string>
<string name="msg_Login_1">Invalid Username or Password!</string>
<string name="msg_Login_2">Wellcome Dear</string>
</resources>

aynı şekilde values-fr klasörü içerisindeki string.xml dosyasını da aşağıdaki gibi değiştiriyoruz.

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Android Programımız</string>
<string name="app_name">Deneme App Giriş Ekrani</string>
<string name="lblUsername">Kullanıcı Adı: </string>
<string name="lblPassword">Şifre: </string>
<string name="lblBtnGiris">Giriş</string>
<string name="msg_Login_1">Geçersiz kullanıcı adı veya parola!</string>
<string name="msg_Login_2">Hoşgeldiniz Sayın</string>
</resources>

xml tarafında yapacağımız son değişiklik layout klasörü içerisinde bulunan main.xml dosyasındaki tüm viewların text attributelerini aşağıdaki gibi değiştirmek. Ben sadece bir tanesini örnek olarak koyuyorum.

<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="2"
android:text="@string/lblUsername"
android:gravity="right"
/>

Artık xml tarafında yapacaklarımız bitti. Şimdi kod tarafına geçelim. Toast.makeText methodumuzu aşağıdaki gibi değiştirelim.

Toast.makeText(getApplicationContext(), R.string.msg_Login_2 + ' ' + txtUsername.getText().toString(), Toast.LENGTH_SHORT).show();

Şimdi uygulamamızı hiç dil değişikliği yapmadan çalıştıralım.


Şimdi de dili fransızcaya getirip uygulamamızı tekrar çalıştıralım.


Dosya İsmi: Activity_View_Toast_Localization.rar
Dosya Boyutu:43.97 KB