2013-07-22 22 views
12

Bir Fragmanın dahili durumuyla gerçekten kafam karıştı. Bir kerede yalnızca bir Parçayı tutan bir Etkinliğim var ve başka bir Parçanın gösterilmesi gerekiyorsa, bunu değiştirir. onSaveInstanceState dokümanlarından, onSaveInstanceState Faaliyetleri (benim durumumda çağrılmayan) SADECE olarak adlandırılır.Fragments'dan "onViewStateRestored" nasıl çalışır?

Fragmanımı durdurursam, kendi durumunu bir Singleton içinde saklayacağım (evet, ben de Singleton'dan nefret ettiğimi biliyorum, ama benim fikrim yoktu). Bu yüzden ViewHirarchy'u yeniden oluşturmalıyım, yeni Görünümler oluştur (new anahtar sözcüğünü kullanarak), durumunu geri yükleyip onCreateView'a geri vermeliyim. Ayrıca, bu Görünüm içinde açıkça bir durumunu depolamak istiyorum bir Checkbox var.

Ancak FragmentManager "akıllı" olmak istiyor ve kendime yarattı asla bir Paket ile onViewStateRestored çağırır ve eski CheckBox durumunu "geri" ve benim YENİ CheckBox uygular. Bu kadar çok soru ortaya çıkıyor:

Paketi onViewStateRestored'dan kontrol edebilir miyim?

FragmentManager, (muhtemelen çöp toplama) CheckBox durumunu nasıl alır ve yenisi ile uygular?

Neden sadece o Özetle (Değil TextView'lar ait ??) Checkbox Yani

durumunu kaydetmek kapsamaz: onViewStateRestored nasıl çalışır?

Ben Fragmentv4 kullanıyorum Not, bu nedenle hiçbir API> 17 onViewStateRestored

cevap

17

Kuyu için gerekli, bazen fragmanları biraz kafa karıştırıcı alabilirsiniz, ama bir süre sonra onlara alışmak ve onlar olduğunu öğrenmek senin her şeyden sonra arkadaşlar.

Parçanızın onCreate() yönteminde şunu yaparsanız: setRetainInstance (true); Görüşlerin görünür durumu korunacak, aksi halde olmayacak.

sınıfı F "f" adlı bir parçasını düşünelim, onun yaşam döngüsü böyle gider: - Bunu göstermek/takılarak/başlatmasını zaman o denir f'in yöntemleri bu sırada şunlardır:

F.newInstance(); 
F(); 
F.onCreate(); 
F.onCreateView(); 
F.onViewStateRestored; 
F.onResume(); 

Bu noktada, parçanız ekranda görünecektir. Varsa, aygıt döndürüldüğü için, parça bilgileri korunmalıdır, bu, döndürme tarafından tetiklenen olayların akışıdır:

F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW. 
F.onDestroyView(); //destroy any extra allocations your have made 
//here starts f's restore process 
F.onCreateView(); //f's view will be recreated 
F.onViewStateRestored(); //load your info and restore the state of f's view 
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here. 


//store the information using the correct types, according to your variables. 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("foo", this.foo); 
    outState.putBoolean("bar", true); 
} 

@Override 
public void onViewStateRestored(Bundle inState) { 
    super.onViewStateRestored(inState); 
    if(inState!=null) { 
     if (inState.getBoolean("bar", false)) { 
      this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo"); 
     } 
    } 

}