2012-09-08 24 views
11

Tôi có chế độ xem tùy chỉnh mở rộng LinearLayout. Tôi đã thực hiện onSaveInstanceState() và onRestoreInstanceState() để lưu trạng thái xem hiện tại. Tuy nhiên không có hành động nào được thực hiện. Khi tôi đặt một bản ghi bên trong hai phương thức đó thì cũng không có gì xuất hiện trong Log Cat. Tôi cho rằng hai phương pháp đó thậm chí không được gọi. Ai có thể giải thích đâu là vấn đề? Cảm ơn.onSaveInstanceState() và onRestoreInstanceState (trạng thái Parcelable) không được gọi?

@Override 
public Parcelable onSaveInstanceState() { 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("instanceState", super.onSaveInstanceState()); 
    bundle.putInt("currentPage", currentPage); 
    return bundle; 
} 

@Override 
public void onRestoreInstanceState(Parcelable state) { 

    if (state instanceof Bundle) { 
     Bundle bundle = (Bundle) state; 
     currentPage = bundle.getInt("currentPage"); 
     Log.d("State", currentPage + ""); 
     super.onRestoreInstanceState(bundle.getParcelable("instanceState")); 
     return; 
    } 
     super.onRestoreInstanceState(state); 
    } 

Trả lời

4

Sau khi đào trong hệ điều hành Android, tôi cuối cùng cũng đã tìm ra. Như tôi nghi ngờ: không có gì sai với hai phương pháp đó. Họ không được gọi. Trên trang web bạn có thể đọc 'onRestoreInsatnceState được gọi khi hoạt động được tạo lại' Ok, nó tạo cảm giác nhưng nó không hoàn toàn đúng. Có, onRestoreInstanceState() được gọi khi hoạt động được tạo lại nhưng chỉ có iff:

nó đã bị hệ điều hành giết. "Tình huống như vậy xảy ra khi:

  • hướng của thay đổi thiết bị (hoạt động của bạn bị phá hủy và tái tạo)
  • có một hoạt động ở phía trước của bạn và tại một số điểm hệ điều hành giết chết hoạt động của bạn để giải phóng bộ nhớ (ví dụ) Lần sau khi bạn bắt đầu hoạt động của mình onRestoreInstanceState() sẽ được gọi. "

Vì vậy, nếu bạn đang ở trong hoạt động của bạn và bạn nhấn nút Back trên thiết bị, hoạt động của bạn là kết thúc() ed và thời gian tiếp theo bạn khởi động ứng dụng của bạn nó được bắt đầu một lần nữa (có vẻ như tái tạo, phải không?) nhưng lần này là không có trạng thái đã lưu vì bạn đã cố ý thoát khi bạn nhấn nút Quay lại.

+6

tôi đã có vấn đề chính xác như nhau, nhưng đó là vì tùy chỉnh của tôi 'View' không có một' bộ id'. Từ các tài liệu _ "Lưu ý rằng ngay cả khi đóng băng được bật, chế độ xem vẫn phải có id được gán cho nó (thông qua setId (int)) cho trạng thái được lưu." _ –

3

Như nhận xét của Steven Byle đã đề cập, tùy chỉnh View phải có id được gán cho số onSaveInstanceState để được gọi. Tôi thực hiện điều này bằng cách thiết lập một id trong constructor tùy chỉnh View tôi:

public class BoxDrawingView extends View { 
    private int BOX_DRAWING_ID = 555; 
    … 

    public BoxDrawingView(Context context, AttributeSet attrs) { 
     … 
     this.setId(BOX_DRAWING_ID); 
    } 
    … 

} 
+0

Điều này rất nguy hiểm. Trong trường hợp bạn sẽ thêm nhiều 'BoxDrawingView' trong cùng một bố cục, tất cả chúng sẽ được khôi phục với cùng trạng thái như lần thêm cuối cùng! – Antimonit

+0

Do cấp API có giải pháp cho vấn đề đó: hãy sử dụng View.generateViewId() xem: https://developer.android.com/reference/android/view/View.html#generateViewId() – bw15

Các vấn đề liên quan