Android: Nasıl Dinamik ve Unique Id Generate Ederiz?


Başınıza gelmemesi neredeyse imkansız bir sorun için birkaç küçük not!

Herşeyin xml’lerde olduğu bir dünya kesinlikle daha kolay olurdu. View’ler sayfaya daha hızlı yüklenirdi, tüm attribute’ler xml’den verilirdi. Ama bazen view’lerimizi koşullara bağlı olarak dinamik olarak oluşturmamız gerekir. Peki bu durumda ayırt edici olmasını sağlayan id’lerimizi unique olarak nasıl generate ederiz?

Bir yol tag kullanmak ve tagler aracılığıyla ayrımı sağlamak olabilir. Bir diğer çözüm olarak yine id kullanırız ama id’lerimizi xml’de tanımlayıp erişim view’imize set edebiliriz. Ancak eğer view’lerimizin sayısı belli değilse o zaman işler biraz değişir. Burada en büyük sorun da çakışma yaşama ihtimalidir. Çünkü eğer iki farklı view’e aynı id’yi verirsek, yanlış view’e erişme, cast exceptionlar gibi sorunlarla karşılaşabiliriz.

Google bunun ciddi bir ihtiyaç olduğunu farkedip, API Level 17 üstüne View.generateViewId() methodunu ekledi. Ancak alt versiyonlar için generateViewId’nin source kodunu projemizdeki bir utile ekleyip kullanabiliriz.

private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

/**
 * Generate a value suitable for use in {@link #setId(int)}.
 * This value will not collide with ID values generated at build time by aapt for R.id.
 *
 * @return a generated ID value
 */
public static int generateViewId() {
    for (;;) {
        final int result = sNextGeneratedId.get();
        // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
        int newValue = result + 1;
        if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
        if (sNextGeneratedId.compareAndSet(result, newValue)) {
            return result;
        }
    }
}

API level kontrolü yaparak da eski versiyonlarda kendi yazdığımız methodun kullanılmasını yeni versiyonlarda ise API içerisindeki methodun kullanılmasını sağlayabiliriz.

 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {

        myView.setId(Utils.generateViewId());

    } else {

        myView.setId(View.generateViewId());

    }
Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.