2012-04-03 3 views
8

왼쪽 패널에는 메뉴 항목 목록 (조각 M)과 오른쪽에 현재 선택된 항목 (조각 D)의 세부 정보가 표시됩니다.Android onConfigurationChanged : 조각을 다시 저장하고 복원하는 방법은 무엇입니까?

사용자가 조각 D에서 항목을 선택하면 조각 D가 다른 조각으로 바뀝니다 (D1이라고 함). 사용자가 조각 D1에서 항목을 선택하면 조각 D1이 다른 조각으로 바뀌고 (D2라고 부름). 물론, 사용자가 뒤로 버튼을 누르면 조각 기록에서 돌아갈 수 있습니다 : D2-> D1-> D.

문제점 : 구성 변경시 (특히 화면 방향으로) 전체 조각 백 스택을 저장하고 복원하려면 어떻게합니까?

그 누구도이 문제를 전에 경험해 보지 못했지만 Google 검색 및 스택 오버플로에서이 문제에 관해서는 아무 것도 발견하지 못했습니다. 관련 게시물을 놓친 경우 알려주십시오.

단순히 액티비티 레크리에이션을 피하기 위해 내 액티비티에 android:configChanges="orientation|screenSize" 속성을 추가 할 수 있다는 것을 알고 있지만 단순히 그렇게 할 수는 없습니다.

내가 할 수없는 이유는 이전 버전과의 호환성을 위해 Action Bar Sherlock (4 절)을 사용하고 있으며 구성 변경시 AFAIK가 올바르게 작동하려면 액티비티 레크리에이션이 필요하다는 것입니다.

활동을 파괴하고 다시 만들지 않고 액션 바 셜록 구성 요소를 다시 만드는 또 다른 방법이 있다면 알려주십시오. 사전에

감사합니다.

답변

0

액션 바 셜록 (ABS)은 ABS 3.x에서 활동을 재창조하는 과정에서 액션 바를 재 작성해야했지만 @Jake Wharton's comment에 따르면 버전 4는 레크레이션이 필요하지 않습니다. 방향 변경을 처리 할 수 ​​있습니다. 따라서 android : configChanges = "orientation"을 설정하면 조각 백 스택이 유지됩니다.

+1

@ Iarham1 답장을 보내 주셔서 감사합니다. 안타깝게도 ABS 4는 [문제 # 279]에서 설명한대로 android : configChanges = "orientation"설정시 일부 OS 버전 (예 : 2.3.7)에서 여전히 문제가 있습니다 (https://github.com/JakeWharton/ActionBarSherlock/issues/279#issuecomment-4934511), 현재로서는 실행 가능한 솔루션이 아닙니다. Jake Wharton이 가까운 장래에 문제를 해결할 수 있기를 바랍니다. 그러나 그 사이에 여러분이나 다른 사람들은 구성 변경시 전체 조각 백 스택을 저장하고 복원하는 방법을 알고 있습니까? 아니면 구성 변경에 ABS 만 프로그래밍 방식으로 다시 작성하도록 ABS 코드를 조정하는 방법? – Luke

5

Fragments를 캐럿하여 자신의 ArrayList에 추가 할 수있었습니다. 그런 다음 OnBackStackChangedListener를 설정하여 어느 것이 표시되었는지 추적하고 필요에 따라 ArrayList를 팝합니다.

내 목적은 조금 다르지만 아래 코드는 설명하는 내용에 필요한 것이어야합니다. 태그는 필요한 경우 여러 개의 백 스택을 가질 수 있도록되어 있습니다. 그것은 그대로 컴파일되지 않을 것이고 (나는 많은 코드를 잘라 냈지만) 내가 어떻게했는지에 대한 아이디어를 줄 것입니다. 추가 면책 조항 : I 그냥이 작동하고 아직 공격하지 않은 문제가있을 수 있습니다. 액티비티가 방향 변경 후 다시됩니다 경우

public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag) 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.detach(visibleFragment); 
     ft.add(R.id.realtabcontent, fragment, tag); 
     ft.attach(fragment); 
     ft.addToBackStack(null); 
     manualBackStacks.get(tag).add(fragment); 
     ft.commit(); 
     this.getSupportFragmentManager().executePendingTransactions(); 
    } 

코드 당신이 원하는 것 :

ArrayList<Fragment> backStack = 
     new ArrayList<Fragment>(manualBackStacks.get(tag)); 
popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote 
for (int bs = 1; bs < backStack.size(); bs++) { 
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag); 
} 

가기 backstack 리스너 :이 도움이

public void onBackStackChanged() { 
    int index = getSupportFragmentManager().getBackStackEntryCount(); 
    ArrayList<Fragment> backStack = manualBackStacks.get(tag); 
    visibleFragment = backStack.get(index); 
    // Pop the last element if we've backed up. 
    popArrayListToIndex(backStack, index); 
} 

희망을.

+0

저는이 접근법에 매우 흥미가 있습니다. 그러나 당신의 대답이 나를 이해하기에 충분한 세부 사항을 제공한다고 느끼지 않습니다. 당신은 당신의 대답에 더 많은 세부 사항을 추가 할 수 있습니까? – deepwinter

+0

이것을 고쳐서 고맙습니다! – deepwinter

관련 문제