Saya telah menemukan banyak contoh pertanyaan serupa pada SO tetapi sayangnya tidak ada jawaban yang memenuhi persyaratan saya.
Saya memiliki tata letak yang berbeda untuk potret dan lansekap dan saya menggunakan tumpukan belakang, yang keduanya mencegah saya menggunakan setRetainState()
dan trik menggunakan rutin perubahan konfigurasi.
Saya menunjukkan informasi tertentu kepada pengguna di TextViews, yang tidak disimpan di penangan default. Saat menulis aplikasi saya hanya menggunakan Aktivitas, yang berikut ini berfungsi dengan baik:
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));
}
Dengan Fragment
s, ini hanya berfungsi dalam situasi yang sangat spesifik. Secara khusus, yang rusak adalah mengganti sebuah fragmen, meletakkannya di tumpukan belakang dan kemudian memutar layar ketika fragmen baru ditampilkan. Dari apa yang saya mengerti, fragmen lama tidak menerima panggilan onSaveInstanceState()
ketika diganti tetapi entah bagaimana tetap terhubung dengan Activity
dan metode ini dipanggil nanti ketika View
tidak ada lagi, jadi mencari salah satu TextView
hasil saya menjadi a NullPointerException
.
Juga, saya menemukan bahwa menjaga referensi ke saya TextViews
bukan ide yang baik dengan Fragment
s, bahkan jika tidak apa - apa dengan Activity
. Dalam hal ini, onSaveInstanceState()
sebenarnya menyelamatkan negara tetapi masalah muncul kembali jika saya memutar layar dua kali ketika fragmen disembunyikan, karena onCreateView()
itu tidak dipanggil dalam contoh baru.
Saya pikir menyelamatkan negara dalam onDestroyView()
ke dalam beberapa Bundle
-jenis unsur anggota kelas (itu sebenarnya lebih banyak data, bukan hanya satu TextView
) dan tabungan yang di onSaveInstanceState()
tetapi ada kelemahan lainnya. Terutama, jika fragmen yang saat ini ditampilkan, urutan memanggil dua fungsi dibalik, jadi saya akan perlu untuk account untuk dua situasi yang berbeda. Harus ada solusi yang lebih bersih dan benar!