2015-02-18 19 views
13

Tôi đang làm việc với CustomView mở rộng một số chế độ xem Android như FrameLayout. Trong bố trí của tôi, tôi sử dụng một ViewPager với một PagerAdapter tùy chỉnh.Android View onSaveInstanceState không được gọi là

Vấn đề là Xem tôikhông khôi phục lại nó là trạng thái khi phân đoạn được tái gắn liền với ViewPager/Hoạt động. Ví dụ, tôi có ba mảnh, nếu tôi vuốt sang phần cuối cùng và quay lại đầu tiên, ScrollView không phải là nơi tôi để nó: nó trở về mặc định, ở trên cùng.

Tôi biết rằng với một PagerAdapter, không phải tất cả các đoạn đều hoạt động cùng một lúc, về cơ bản chỉ cần +1/-1.

Tôi không thể tìm thấy lý do tại sao View.onSaveInstanceState() của tôi không được gọi, như onRestoreInstanceState.

Trả lời

22

Câu trả lời dễ dàng: đó là vì tôi không đặt id cho chế độ xem của tôi (tùy chỉnh hay không). Android không quản lý onSaveInstanceState/onRestoreInstanceState nếu không có id nào được đặt thành chế độ xem.

Vì vậy, khi chế độ xem tùy chỉnh của tôi đang mở rộng Chế độ xem cơ sở, không có thuộc tính bổ sung, hãy đặt ID cho chế độ xem đã giải quyết vấn đề và do đó onSaveInstanceState/onRestoreInstanceState được gọi là đúng.

Vì vậy, để tóm tắt, sử dụng một trong những phương pháp này:

từ XML

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    ... 
    android:id="@+id/scrollView"> 
</ScrollView> 

OR từ Java

yourCustomView.setId(R.id.myCustomView); 

là trường hợp cuối cùng, bạn thêm id tĩnh để res/values ​​/ ids.xml <item name="myCustomView" type="id"/>

+1

đối với tôi điều này không hoạt động trên thay đổi định hướng với các bố cục khác nhau cho cảnh quan và dọc. OnSaveInstanceState được gọi, nhưng onRestoreInstanceState không phải là – Boy

+0

@Boy Tôi đang gặp vấn đề tương tự. là chế độ xem của bạn trong một phân đoạn được lưu trữ trên máy xem? –

+0

@AndreaBaccega đó là trường hợp thực sự. Có vẻ như ViewPager thực hiện một số khôi phục cũng như các đoạn mã – Boy

3

Lưu trạng thái theo mặc định

Hiện tại, chúng tôi có mọi thứ để lưu và khôi phục trạng thái của nó. Tuy nhiên, điều này sẽ không xảy ra theo mặc định. Nếu bạn muốn các phiên bản của chế độ xem của bạn tự động lưu trạng thái, bạn có thể thêm dòng này vào phương thức init:

setSaveEnabled(true); 

Việc này có tùy thuộc vào bạn hay không. Ngay cả khi chế độ xem của bạn không lưu trạng thái theo mặc định, người dùng của chế độ xem luôn có thể bật trạng thái lưu bằng cách gọi setSaveEnabled (true) hoặc bằng cách chỉ định android: saveEnabled = “true” trong bố cục xml.

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