Mastering in Fragments


Ne kadar çok fragment kullandığınız ya da kaç yıldır Android developer olarak çalıştığınızdan bağımsız olarak, her Fragment kullandığınızda Fragmentle ilgili şaşırtıcı şeyler öğrenebilirsiniz. En azından benim için öyle 🙂 Bazılarınız yazıyı tamamladığınız yaa bunları bilmiyor muydun diyeceksiniz, bazıları ben de çektim evet diyecek ama benim amacım bir gün bunu yaşarsanız yol gösterici olması.

Bugünün konusu ise setUserVisibilityHint methodu. Aslında bakıldığında çok faydalı görünüyor. Fragment’in bize ne zaman visible olduğu/olmadığı bilgisini veriyor. Buna göre sayfanın çizilmesinde aksiyon alabiliriz, bir task başlatıp örneğin data çekeceksek burada yapabiliriz. Böylece optimizasyon sağlayabiliriz. Ama tutorial’da da belirtmiş ki lifecycle’a bağlı olarak Fragment yaratıldıktan sonra çağrılmayabilir. Fragment göründüğü an çağrılacak ancak, önce setUserVisibilityHint methodu sonra onCreate çağrılabilir.

Fragment’i tek başına kullanıyorsanız ya da çok fazla sayıda fragment içeren bir viewpager’ınız varsa bu case’e düşebilirsiniz. Çünkü gerçekten de yaratılma anı ve gösterim anı çakışabilir. Bu durumda örneğin data çekeceğinizi düşünelim, hem visibility’yi hem de isResumed() i çağırarak double check yapabilirsiniz. Kod yazmadan sadece anlatarak çok da açıklayıcı olmuyor. Aşağıdaki kod bloğu anlatmak istediğimi gösteriyor 🙂

Peki bu case’e düşmeyi beklediğimiz senaryo nedir dersek pageradapter hepimizin bildiği gibi optimizasyon için kendisi dışında bir fragmenti daha yaratıyor. Yani eğer 2 fragment’im var ve viewpager kullanmama rağmen yine de bu method ilk açılışda true dönüyorsa bir tuhaflık var demektir. Çünkü object olarak en azından Fragmentimiz elimizde. Peki sonuç, girebiliyor.

Burada bilmediğimiz ama hayati olan bilgi setUserVisibilityHint methodunun default’da true dönmesi. Bunun sebebini hala anlayabilmiş olmasam! da eğer sadece vibility’yi kullanırsanız burada sorun yaşanacağı kesin. Source kodu inceleyince farkettim 😀 Bu case’e ne zaman düşebilirsiniz? Sayfanızın açıldığı an ve sonrasında(remoteconfig’den değişmesi gibi) , başlangıçta var olmayan bir fragment yaratılacak. notifyDataSetChanged çağrıldı ama olacak senaryo beklenenden farklı olabilir. Fragment daha yaratılmadan setUserVisibilityHint trigger edildi ve de true’ydu. Oysaki fragment visible zannerek yazdığımız kodumuz bu sefer crashe sebep olabilir.

setUserVisibilityHint’le başı derde girenler olursa, yardımcı olması dileğiyle!

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 )

w

Connecting to %s

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