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!
Leave a Reply