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