2012-06-20 3 views
34

savedInstanceState()을 사용하여 조각을 제거 할 때 상태를 저장 한 다음 조각을 다시 스택에서 팝하는 상태를 복원 할 수 있습니까? 백 스택에서 조각을 복원하면 savedInstanceState 번들은 항상 null입니다.백 스택에서 조각을 복원 할 때 savedInstanceState

현재 앱 흐름은 다음과 같습니다. 조각 생성 -> 조각 제거 (백 스택에 추가됨) -> 백 스택에서 조각이 복원 됨 (savedInstanceState 번들이 null 임). 나는 문제가 제거되는 및 스택을 다시 추가 할 때 onSavedInstanceState()가 호출되지 않습니다 것을 생각

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); 
    } 

:

다음은 관련 코드입니다. onsavedInstanceState()를 사용할 수 없다면이 문제를 해결할 다른 방법이 있습니까?

답변

0

FWIW에 대한 답변을 확인하십시오.하지만 필자의 경우 onSaveInstanceState가 제대로 호출되었으며 스마트 폰에 새로운 활동 조각이 생겼을 때 내 상태 데이터를 푸시했습니다. 당신과 마찬가지로, onActivityCreated는 w/savedInstanceState가 항상 null로 불려졌습니다. IMHO, 나는 그것이 버그라고 생각한다.

내가 정적하여 MyApplication 상태를 만들고 "전역 변수"에 해당 거기에 데이터를 넣어 주위했다

...

5

나는 그때 전역 변수와 같은 onCreateView에서 돌아보기를 저장하려면 내가 돌아올 때 단순히이를 확인 :

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

많은 감사합니다 :) 그것은 –

+6

확실하지 이것은 좋은 생각이 내 문제를 해결했다. 이것이 메모리에 대한 참조를 저장하면 메모리를 없애는 관점을 파괴하는 목적을 무효화 할 수 있습니까? – craigrs84

+0

직접 테스트를하지 않았기 때문에 실제로 확신 할 수 없습니다. 그러나 내 생각은 이렇게 간다.레이아웃의 모든 요소를 ​​초기화 할 때 이러한 요소의 대부분을 전역 변수로 설정하는 것이 표준이므로 위의 예에서 참조로 인해 기본보기를 재활용 할 수 없으면 Android는 재활용 할 수 없습니다 이 뷰들 중 어느 하나가 메모리와 동일한 문제를 일으킨다. – AllDayAmazing

4

문제는 단편이 가지고 필요가있는 Id하거나 추적 할 수있는 FragmentManager 위해서는 그와 관련된 Tag.

이 작업을 수행하는 적어도 3 가지 방법이 있습니다 : XML 레이아웃에서

  1. 당신의 조각에 대한 Id을 선언

    android:[email protected]+id/<Id> 
    
  2. 당신의 조각 용기 ViewId이있는 경우, FragmentTransaction를 사용 :

    FragmentTransaction add (int containerViewId, Fragment fragment) 
    
  3. 조각에 View (예 : 헤드리스 조각), 그것을 Tag을 제공 :

    FragmentTransaction add (Fragment fragment, String tag) 
    

Also, see this SO answer.