2012-06-20 50 views
34

Tôi có thể sử dụng savedInstanceState() để lưu trạng thái khi xóa một đoạn, sau đó khôi phục trạng thái khi tôi bật đoạn ra khỏi ngăn xếp lại? Khi tôi khôi phục các mảnh từ ngăn xếp trở lại, gói savedInstanceState luôn luôn là null.savedInstanceState khi khôi phục đoạn từ ngăn xếp lại

Hiện tại, luồng ứng dụng là: đoạn được tạo -> đoạn bị xóa (được thêm vào ngăn xếp lại) -> đoạn được khôi phục từ ngăn xếp lại (gói savedInstanceState là rỗng).

Đây là mã có liên quan:

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle bundle = getArguments(); 
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID); 
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID); 

    if (savedInstanceState == null) { 
     selectedVideoNumber = playlistItemId; 
    } else { 
     selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO"); 
    } 
} 

public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber); 
    } 

Tôi nghĩ vấn đề là onSavedInstanceState() không bao giờ được gọi khi đang được gỡ bỏ và được bổ sung để sao chồng. Nếu tôi không thể sử dụng onsavedInstanceState(), có cách nào khác để sửa lỗi này không?

Trả lời

0

FWIW, tôi cũng nhấn vào điều này, nhưng trong trường hợp của tôi, onSaveInstanceState được gọi đúng cách và tôi đẩy dữ liệu trạng thái của mình khi một đoạn hoạt động mới được đưa lên điện thoại thông minh. Giống như bạn, onActivityCreated được gọi là w/savedInstanceState luôn rỗng. IMHO, tôi nghĩ đó là một lỗi.

tôi làm việc xung quanh nó bằng cách tạo ra một trạng thái MyApplication tĩnh và đưa các dữ liệu có cho tương đương với "biến toàn cục" ...

5

Tôi muốn lưu trữ View tôi trở lại trong onCreateView như là một biến toàn cầu và sau đó khi tôi quay trở lại tôi chỉ đơn giản là kiểm tra này:

if(mBaseView != null) { 
     // Remove the view from the parent 
     ((ViewGroup)mBaseView.getParent()).removeView(mBaseView); 
     // Return it 
     return mBaseView; 
    } 
+0

Cảm ơn nhiều :) nó giải quyết vấn đề của tôi –

+6

không chắc chắn đây là một ý tưởng tốt. Điều này có đánh bại mục đích phá hủy khung nhìn để giải phóng bộ nhớ nếu bạn lưu một tham chiếu đến nó? – craigrs84

+0

Tôi thực sự không chắc chắn, vì tôi chưa chạy bất kỳ thử nghiệm trực tiếp nào. Tuy nhiên, suy nghĩ của tôi như thế này.Khi bạn khởi tạo tất cả các phần tử trong bố cục của mình, tiêu chuẩn để đặt hầu hết các phần tử đó là biến toàn cục, vì vậy nếu trong ví dụ trên tôi không thể tái chế Chế độ xem cơ sở vì tham chiếu, Android sẽ không thể tái chế bất kỳ Chế độ xem nào trong số này cũng có thể dẫn đến cùng một vấn đề với bộ nhớ. – AllDayAmazing

4

vấn đề là đoạn cần phải có một Id hoặc Tag liên kết với nó để cho FragmentManager để theo dõi nó.

Có ít nhất 3 cách để làm điều này:

  1. Trong layout xml tuyên bố một Id cho mảnh của bạn:

    android:[email protected]+id/<Id> 
    
  2. Nếu mảnh vỡ của bạn chứa ViewId, sử dụng FragmentTransaction :

    FragmentTransaction add (int containerViewId, Fragment fragment) 
    
  3. Nếu đoạn của bạn không được liên kết với bất kỳ View nào (ví dụ: đoạn không đầu), cung cấp cho nó một Tag:

    FragmentTransaction add (Fragment fragment, String tag) 
    

Also, see this SO answer.

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