8

Bu parça yaşam döngüsü işini pek anlamıyorum.Uygulamalarımın ViewPager'ım aracılığıyla ne zaman görüntülediğimde, fragmanım neden kapsamlı olarak çağrılıyor?

Uygulamamın "ayrıntıları göster" bölümü için oldukça standart bir 3 sayfalık yatay kaydırıcı görünümü Çağrı düzenine sahibim. Uygulamamı üçün orta sayfasında başlatırım. Benim FragmentActivity 1.

FragmentPagerAdapter zaman benim app çöktü kullanarak çünkü FragmentStatePagerAdapter kullanıyorum
mPager.setCurrentItem(1); //default to center page, current data view fragment 

örneğin bir asma durumundan geri geliyor ve ne zaman bu en hızlı yol olduğunu sayfaya sayfasını ayarlar şimdilik bunun için çalışın. İşe yaraşır ama ben devlet meselesinden şüpheleniyorum, belki de buradaki sorunumun sebebi olabilir.

Bu yüzden ilk başta her bir parçanın bir dinlenme servisinden veri almayı ve daha sonra bir listeyi gösterme işini yapacağımı düşündüm ama artık emin değilim.

OnCreateView olayları üzerindeki her bir parçadaki verileri almak için benzersiz bir eşzamansız görev çalıştırmayı denedim. Daha sonra parça yaşam döngüsü hakkında daha fazla bilgi okuduktan sonra onCreateView'a oldukça yoğun bir şekilde çağrıldığını fark ettim. Bu durum, çoğunlukla tel üzerinden çok fazla veri talep eden açgözlü bir uygulama için yapıldı.

Açık konuma getirme özelliği değişmedi. OnCreate hala 2 bitişik parça için onCreateView kadar çağrılıyor.

Tuhaf olan, Fragman Etkinliği'nde görüntülenecek ilk bölüm olarak ayarladığım parçanın yalnızca bir kez çağrılan onCreate'i almasıdır.

Burada bir şey kendini hissetmiyor.

Şu anda, ebeveyn parça etkinliğinin bildirilmesini ve parçalarda görüntülemem gereken verileri almak için tüm async görevlerini çağırmam gerektiğini düşünüyorum. Async çağrılarının sonuçlarını, ana parça etkinliği tarafından sahip olunan bir nesneye ayarlayın ve daha sonra, parçaların liste görünümü oluşturmak için üst öğenin içerdiği nesneyi kullanın.

Ancak, async görevleri ebeveyn tarafından başlatılmışsa ne olur? etkinlik

karıştı, imzalı ..... denilen ve ebeveyn tarafından taşınan nesne, henüz hazır değildir onCreateView her parçaları önce bitirmek yoktur ve sinirli

cevap

25

ViewPager şeyler kapatılması oldukça gayretli olduğunu şu anda kullanmıyor ve bu tam olarak burada ne oluyor. Varsayılan davranış, ViewPager'ın sayfanın her iki tarafındaki bir sayfanın "çevresinde" kalması ve geri kalanını yok etmesidir. Dolayısıyla, 3 sayfalık görünümünüzde, sayfa 1'i seçerken sayfa 3 yok olur, ardından sayfa 2 yeniden seçildiğinde sayfa 3 yeniden oluşturulur. Fark ettiğiniz gibi, sayfa 2'de yalnızca bir kez çağrılan onCreate(..) vardır, çünkü o anda seçili olan sayfanın her zaman bitişik veya mevcut durumdadır.

Bunu çözmek için, ViewPager.setOffscreenPageLimit(2)'u ayarlamanız yeterlidir. Ardından ViewPager tüm Fragmanlarınızı koruyacaktır. Açıkçası bu, çok sayıda Fragman için iyi bir fikir değildir, ancak sizin durumunuz için iyi olmalıdır.

+0

Ah, bu denemeye yardımcı olur. öyleyse, hey, bir parçadan gelen eşzamansız görevlerin işlenmesini standart bir yol gibi görüyor mu? Şu anda, parçam Etkinliğim yüklendikten sonra üç ayrı async görevini kovuyorum, doğru ya da yanlış .... – topwik

+0

Evet, bir kullanıcı AsyncTask çalışırken cihazı döndürürse bununla ilgili olarak görebileceğim tek sorun. Ancak onlarla çok fazla tecrübem yok. AsyncTaskLoader sınıfını incelemeye değer olabilir, Loader sınıflarının sizin için bir çok şeyi otomatikleştirdiğine inanıyorum. –

+0

Ayrıca bu konuda da kapana kısılmıştım. Şimdi işe koyuldum. Çok teşekkürler. – Durai

2

@ Espiandev'in çözümü mevcut durumunuz için işe yarayacak, ancak sizin durumunuzun devlet hakkı olduğu konusunda haklısınız. Fragment durumunuzu kaydetmek için setArgument ve/veya onSaveInstanceState yöntemlerini kullanmalısınız (örn., sunucudan gelen bir yanıt genellikle bir dize olarak temsil edilebilir ve sonra geri yüklemek için getArgument ve/veya onCreate geçirilen Bundle kullanın.

Alternatif olarak, olabilir sizin Activity sunucu getirir yapmak ve sonra parçaların her biri için setArgument çağrı ve verileriniz henüz gelip gelmediğini belirlemek için Fragment içindeki argümanlar kontrol (ve eğer potansiyel bir yükleme görüntüler bir tür durum.

Ekran yönünün değişmesiyle ilgili her şeye dikkat ederseniz, this related question da sizin için yararlı olacaktır.

+0

teşekkürler, adam. cevabı takdir ediyorum. "Bu çağrı cihazında çok daha fazla parça varsa," ile takip etmek istedim. – topwik

İlgili konular