2013-03-25 14 views
21

FragmentManager'ın arka kısmına yerleştirdiğim parçalarım var. Her parça devlet örneğin böyle, üye değişkenler yönü değişikliklerine ilişkin kaydedilir:OnSaveInstanceState'i arka plandaki parçalarla mı kullanıyorsunuz?

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putLong("userId", mUserId); 
    outState.putString("username", mUsername); 
} 

Benim sorunum backstack her parçası onSaveInstanceState aracılığıyla çağrılan beri bir oryantasyon değişikliği, varsa, ben bir null elde ediyoruz üye değişkenleri artık mevcut olmadığından işaretçi istisnası.

Bunu nasıl çözeceğinizle ilgili herhangi bir fikir var mı?

+0

Logcat hata iletinizi sağlayabilir misiniz? –

+0

onSaveInstanceState, gerçek değişiklik uygulanmadan önce çağrılır, böylece kodunuzdaki diğer hatalar nedeniyle boş olmadıkça, değişkenleriniz onları çağırdığınızda var olmalıdır. Hata çıkışı formu Logcat ile birlikte biraz daha kod gönderin. – Shade

+0

Sizi değişkenlerimin iyi olduğundan emin olabilirim. Sorun şu ki, backstack'teki parçalarım, yırtıldıklarında çağrılanSaveInstanceState'e girmiyor; onSaveInstanceState yalnızca etkinlik yok olduğunda çağrılır, ancak değişkenlerim artık mevcut değil. Bu yüzden şu anki çözümüm şu: "eğer (mUserId! = Null && mUsername! = Null) ...". Güzel değil, ama sorunu çözüyor. Parça parçalandığında, fragmanlar için bir onSaveInstanceState yöntemine sahip olmak tuhaf buluyorum. –

cevap

34

Activity ürününüzdeki FragmentManager tüm parçalarınızla ölmekte olduğundan üye değişkenleriniz artık mevcut değil. Eğer Fragments devlet kaydetmeden önce Activity durumunu kaydetmek gerekir çünkü

Sen yanı senin Activity sınıfının yöntemini onSaveInstanceState geçersiz kılmak gerekir. documentation olarak

söyler:

bulunmaktadır (örneğin, bir kullanıcı arayüzü gösteren geri yığını üzerine yerleştirildiğinde olduğu gibi) bir fragmanının en çok yıkılabilir birçok durum vardır, ancak durum kadar kaydedilmeyecektir

Sahip olma faaliyetinin aslında devletini korumasına ihtiyacı vardır.

GÜNCELLEME sizin ActivityonSaveInstanceState ve onRestoreInstanceState yılında

, size Fragment referansları kaydetme ve sonra böyle bir şey ile onları geri deneyin: Eğer şans olsaydı

public void onSaveInstanceState(Bundle outState){ 
    getFragmentManager().putFragment(outState,"myfragment",myfragment); 
} 
public void onRestoreInstanceState(Bundle inState){ 
    myFragment = getFragmentManager().getFragment(inState,"myfragment"); 
} 

sonra söyle! :-)

+0

Öyleyse ne yapmalıyım? Etkinliğin onSaveInstanceState öğesinden onSaveInstanceState öğesini çağırmalı mıyım? –

+0

Yanıtınızda sizin için bir UPDATE. –

+0

tamam ... fragmanlar için onSaveInstanceState oldukça değersizdir. En azından, arka yığında bulunan parçalar (parça işlemleri) için. –

0

Parça yardımında setRetainInstance ayarlanıyor mu?

+0

UI amacı için parça kullanılıyorsa, asla "setRetainInstance" değerini "true" değerine ayarlamaz! – matusalem

5

Yapı Jorge Gil denemek - 'xɔɾ.xɛ xil cevap şu Not: onSaveInstanceState() ve onRestoreInstanceState süper uygulamaları çağrı

  • unutmayın().
  • Destek paketini kullanıyorsanız: Lütfen getFragmentManager() yerine getSupportFragmentManager() kullanın.
  • Orijinal fragmanınızı alırken, yayınlamanız gerekir.

Kaptan bariz olduğu için üzgünüm!

0

onSaveInstanceState'dan önce çağrılan bu savedInstanceState numaralı numaralı üye değişkenlerini düzgün bir şekilde okumak uygun çözüm olduğunu düşünüyorum. Alanları onViewCreated'da işlerseniz, bir sonraki onSaveInstanceState'dan önce başlatma özelliğine sahip olmazlar (bu özel durumda, Fragman arka tarafta olduğunda).

İlgili konular