2013-07-22 41 views
12

Tôi thực sự bối rối với trạng thái nội bộ của một Fragment. Tôi có một Hoạt động chỉ giữ một Fragment cùng một lúc và thay thế nó, nếu một Fragment khác sẽ được hiển thị. Từ tài liệu onSaveInstanceState được gọi là CHỈ nếu hoạt động onSaveInstanceState đang được gọi (không được gọi trong trường hợp của tôi).Làm cách nào để `onViewStateRestored` từ Phân đoạn hoạt động?

Nếu tôi dừng phân đoạn của mình, tôi sẽ lưu trữ trạng thái của bản thân trong một Singleton (vâng, tôi biết tôi ghét Singletons, nhưng không phải là ý tưởng của tôi để làm như vậy). Vì vậy, tôi phải tạo lại toàn bộ ViewHirarchy, tạo Chế độ xem mới (bằng cách sử dụng từ khóa new), khôi phục trạng thái của nó và trả lại chúng trong onCreateView. Tôi cũng có Hộp kiểm bên trong Chế độ xem này mà từ đó tôi làm rõ ràng KHÔNG muốn lưu trữ trạng thái của nó.

Tuy nhiên FragmentManager muốn trở thành "thông minh" và kêu gọi onViewStateRestored với một Bundle Tôi không bao giờ tạo ra bản thân mình, và "khôi phục" tình trạng cũ CheckBox và áp dụng nó để CheckBox MỚI của tôi. Điều này đưa ra rất nhiều câu hỏi:

Tôi có thể kiểm soát gói từ onViewStateRestored không?

Trình quản lý phân đoạn có trạng thái của hộp kiểm (có thể đã thu thập rác) và áp dụng nó cho hộp kiểm mới?

Tại sao nó chỉ lưu trạng thái của Checkbox (Không của TextView ??)

Vì vậy, để tóm tắt: Làm thế nào để onViewStateRestored làm việc?

Note Tôi đang sử dụng Fragmentv4, vì vậy không API> 17 cần thiết cho onViewStateRestored

Trả lời

17

Vâng, đôi khi các mảnh vỡ có thể có được một chút bối rối, nhưng sau một thời gian bạn sẽ làm quen với họ, và biết rằng họ là bạn bạn bè sau khi tất cả.

Nếu trên phương thức onCreate() của đoạn của bạn, bạn làm: setRetainInstance (true); Trạng thái hiển thị của các chế độ xem của bạn sẽ được giữ lại, nếu không thì sẽ không.

Giả sử một đoạn gọi là "f" của lớp F, vòng đời của nó sẽ đi như thế này: - Khi instantiating/gắn/hiển thị nó, đó là phương pháp của f được gọi là, theo thứ tự này:

F.newInstance(); 
F(); 
F.onCreate(); 
F.onCreateView(); 
F.onViewStateRestored; 
F.onResume(); 

Tại thời điểm này, đoạn của bạn sẽ hiển thị trên màn hình. Giả sử rằng thiết bị được xoay, do đó, thông tin phân đoạn phải được giữ nguyên, đây là luồng sự kiện được kích hoạt bởi vòng quay:

F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW. 
F.onDestroyView(); //destroy any extra allocations your have made 
//here starts f's restore process 
F.onCreateView(); //f's view will be recreated 
F.onViewStateRestored(); //load your info and restore the state of f's view 
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here. 


//store the information using the correct types, according to your variables. 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("foo", this.foo); 
    outState.putBoolean("bar", true); 
} 

@Override 
public void onViewStateRestored(Bundle inState) { 
    super.onViewStateRestored(inState); 
    if(inState!=null) { 
     if (inState.getBoolean("bar", false)) { 
      this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo"); 
     } 
    } 

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