Tôi đã tìm thấy nhiều trường hợp của một câu hỏi tương tự trên SO nhưng không có câu trả lời nào không may đáp ứng yêu cầu của tôi.
Tôi có các bố cục khác nhau cho dọc và ngang và tôi đang sử dụng ngăn xếp ngược, cả hai đều ngăn tôi sử dụng setRetainState()
và các thủ thuật sử dụng thói quen thay đổi cấu hình.
Tôi hiển thị một số thông tin nhất định cho người dùng trong TextViews, không được lưu trong trình xử lý mặc định. Khi viết ứng dụng của tôi chỉ sử dụng Hoạt động, các hoạt động sau đây đã hoạt động tố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));
}
Với Fragment
s, điều này chỉ hoạt động trong các tình huống rất cụ thể. Cụ thể, những gì phá vỡ khủng khiếp là thay thế một đoạn, đặt nó vào ngăn xếp phía sau và sau đó xoay màn hình trong khi đoạn mới được hiển thị. Theo những gì tôi hiểu, đoạn cũ không nhận được cuộc gọi onSaveInstanceState()
khi được thay thế mà vẫn được liên kết bằng cách nào đó Activity
và phương thức này được gọi sau khi nó View
không còn tồn tại nữa, vì vậy hãy tìm bất kỳ TextView
kết quả nào của tôi vào a NullPointerException
.
Ngoài ra, tôi thấy rằng việc giữ tham chiếu đến tôi TextViews
không phải là ý hay với Fragment
s, ngay cả khi nó ổn với Activity
's. Trong trường hợp đó, onSaveInstanceState()
thực sự lưu trạng thái nhưng sự cố sẽ xuất hiện lại nếu tôi xoay màn hình hai lần khi đoạn bị ẩn, vì nó onCreateView()
không được gọi trong trường hợp mới.
Tôi đã nghĩ đến việc lưu trạng thái onDestroyView()
vào một số Bundle
phần tử thành viên của lớp (thực sự là nhiều dữ liệu hơn, không chỉ một TextView
) và lưu nó vào onSaveInstanceState()
nhưng còn có những hạn chế khác. Về cơ bản, nếu đoạn này hiện được hiển thị, thứ tự gọi hai hàm bị đảo ngược, vì vậy tôi cần tính đến hai tình huống khác nhau. Phải có một giải pháp sạch hơn và đúng đắn!