SO hakkında benzer bir sorunun birçok örneğini buldum, ancak hiçbir cevap maalesef gereksinimlerimi karşılamıyor.
Portre ve manzara için farklı mizanpajlarım var ve arka plan yığınını setRetainState()
kullanıyorum.
Varsayılan işleyiciye kaydedilmemiş olan TextViews'ta kullanıcıya belirli bilgileri gösteririm. Başvurumu yalnızca Etkinlikler kullanarak yazarken aşağıdakiler 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));
}
İle Fragment
s, bu sadece çok özel durumlarda çalışır. Özellikle, korkunç bir şekilde kırılan bir parçayı değiştirmek, arka yığını içine koymak ve daha sonra yeni parça gösterilirken ekranı döndürmektir. Anladığım kadarıyla, eski parça onSaveInstanceState()
değiştirilirken bir çağrı almaz, ancak bir şekilde bağlantılı kalır Activity
ve View
artık mevcut olmadığında bu yöntem daha sonra çağrılır , bu yüzden TextView
s sonuçlarından herhangi birini arıyorum NullPointerException
.
Ayrıca, benim referans referans tutmak 's ile Tamam olsa bile TextViews
, Fragment
s ile iyi bir fikir olmadığını buldum Activity
. Bu durumda, onSaveInstanceState()
aslında durumu kaydeder, ancak parça gizlendiğinde ekranı iki kez döndürürsem onCreateView()
yeni örnekte çağrılmadığı için sorun yeniden ortaya çıkar .
Ben koruma durumudur düşünce onDestroyView()
bazı içine Bundle
(aslında daha fazla veri değil, sadece biri tipi sınıf üyesi elemanı TextView
ve tasarrufu) o içinde onSaveInstanceState()
ancak diğer dezavantajları vardır. Öncelikle, parça şu anda gösteriliyorsa, iki işlevi çağırmanın sırası tersine çevrilir, bu yüzden iki farklı durumu hesaba katmam gerekir. Daha temiz ve doğru bir çözüm olmalı!