Tüm sonra, doğru geri Parçaları örnek durumu nasıl kurtaracağını yığını?
ÇOK benzer bir soru birçok örneğini buldum ama cevap ne yazık ki benim gereksinimleri karşılar.
Portre ve manzara için farklı düzenler ve setRetainState()
ve püf noktaları yapılandırmasını değiştirmek rutinleri kullanarak beni engelleyen hem yığını kullanarak geri döndüm.
Varsayılan işleyicisi kayıtlı değil hangi TextViews kullanıcı için bazı bilgileri vereceğim. Sadece kullanarak uygulama etkinliklerim yazarken, aşağıdaki iyi çalıştı:
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
Fragment
s ile, bu çok özel durumlarda çalışır. Özellikle, korkunç sonları ne bir parçası yerine, yığın geri koyarak ve daha sonra yeni bölümü görülürken, ekran döner. Ne anladım, eski parça değil almak bir çağrı onSaveInstanceState()
ne zaman dolduruluyor ama kalacak bir şekilde bağlı Activity
ve bu yöntemi çağrıldıktan sonra kendi View
yok artık, o yüzden arıyorum hiç benim TextView
s sonuçlara bir NullPointerException
.
Ayrıca, eğer sorun olsaydı bile benim için referans TextViews
tutmak Fragment
s ile iyi bir fikir olduğunu buldum Activity
ile's. Bu durumda, onSaveInstanceState()
ben aslında devlet ama sorun belirirse kaydeder ekranı döndürüniki kezparça, onCreateView()
onun gibi gizli yeni örneği olarak değil.
Bundle
tipi bir sınıfın üye elemanı (aslında daha fazla veri, sadece 20 ** biri) onDestroyView()
devlet tasarruf ve Tasarruf düşündümbuonSaveInstanceState()
ama orada başka bir dezavantajı. Öncelikle, parça halindeşu anda gösterilen iki işlevi çağırma amacıyla iki farklı durum için hesap gerekir diye ters. Temiz ve doğru bir çözüm yolu olmalı!
CEVAP
Doğru Parçasının örneğini durumunu kaydetmek için aşağıdaki kodları yapmalıdır:
Bölümü örneği geçersiz kılmak onSaveİnstanceState tarafından durumunu kaydetmek ve onActivityCreated geri yükleme:
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInstanceState != null) { //Restore the fragment's state here } } ... @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState);
}//Save the fragment's state here
Veönemli bir noktaaktivite, onSaveİnstanceState üzerine parçanın örneğini kaydedin ve onCreate üzerine geri yüklemek zorunda.
public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState != null) { //Restore the fragment's instance mContent = getSupportFragmentManager().getFragment( savedInstanceState, "mContent"); ... } ... } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState);
}//Save the fragment's instance getSupportFragmentManager().putFragment(outState, "mContent", mContent);
Bu yardım umut.
Nasıl 'yeniden' ''...
Nasıl bir geri al `git commit` yerel v...
Nasıl doğru erişim için `` / bu içeriğ...
Nasıl yapmak .NET Windows Hizmeti doğr...
Bunu doğru bir şekilde içe geçmiş bir ...