2011-12-08 2 views
9

내 프로젝트에서 호환성 패키지 v4를 사용하고 있으며보기에서 제거 된 후에 Fragment을 유지하는 데 문제가 있습니다. 내 Activity 2 조각을 표시 ... 왼쪽에있는 메뉴 프레임, 오른쪽에있는 콘텐츠 창. 메뉴 프레임에는 표시 할 수있는 3 가지 메뉴 (조각)가 있습니다.이전에 표시된 조각을 어떻게 복원합니까?

이 나는 ​​메뉴 조각을 대체하고있어 방법은 다음과 같습니다

public void showMenuFragment(Fragment fragment, String tag) { 

     showFragment(R.id.menu_frame, fragment, tag, false); 
     setLastMenuPushed(tag); 
    } 

protected void showFragment(int resId, Fragment fragment, String tag, boolean addToBackStack) { 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 

     if (fragmentManager.findFragmentByTag(tag) != null && fragment.isAdded()) { 
      transaction.remove(fragment); 
     } 

     transaction.replace(resId, fragment, tag).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).setBreadCrumbShortTitle(tag); 

     if (addToBackStack) { 
      transaction.addToBackStack(tag); 
     } 

     transaction.commit(); 
    } 

Fragment의가 표시되기 전에 데이터가로드 될, 그래서 로딩 스피너를 보여줄 필요 메뉴. 처음로드 된 후에는 Activity이 끝나지 않으면 다시로드하지 않아도됩니다. 내가 showMenuFragment(...)를 호출 할 때

나는 FragmentManager.findFragmentByTag(String tag)를 사용하여 Fragment 전달하려고하지만 항상 null, 그래서 나는 다른 메뉴를 표시 할 새로운 Fragment마다해야한다.

제 질문은, 다른 메뉴로 교체 한 후 어떻게합니까? 장치를 회전 할 때 내 Activity 클래스의 인스턴스가 파괴되어 이러한 참조를 잃어 버리기 때문에 Fragment에 대한 수동 참조는 유지하지 않는 것이 좋습니다.

편집 : 훨씬 간단한 용어로 말하면, FragmentManager은 이전의 Fragment을 백 스택에 추가하지 않고도 계속 추적하기를 원합니다. 뒤로 버튼을 누르고 이전 메뉴를 보려고하지 않습니다.

답변

13

그냥 알아 냈습니다. 새 항목을 추가 할 때 단편을 제거하는 대신 단편을 숨긴 다음 다시 표시하고 싶을 때 표시합니다. 수정 된 방법은 다음과 같습니다.

public void showMenuFragment(Fragment fragment, String tag, boolean addToBackStack) { 

     showFragment(R.id.menu_frame, fragment, tag, getLastMenuPushed(), addToBackStack); 
     setLastMenuPushed(tag); 
} 

protected void showFragment(int resId, Fragment fragment, String tag, String lastTag, boolean addToBackStack) { 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 

     if (lastTag != null) { 
      Fragment lastFragment = fragmentManager.findFragmentByTag(lastTag); 
      if (lastFragment != null) { 
       transaction.hide(lastFragment); 
      } 
     } 

     if (fragment.isAdded()) { 
      transaction.show(fragment); 
     } 
     else { 
      transaction.add(resId, fragment, tag).setBreadCrumbShortTitle(tag); 
     } 

     if (addToBackStack) { 
      transaction.addToBackStack(tag); 
     } 

     transaction.commit(); 
} 
+3

이 문제를 되돌아 보면, 더 좋은 해결책은 활동에서 단편을 "분리"하고 클래스의 하드 참조를 유지하는 것입니다. –

+0

detach vs hide의 이점은 무엇입니까? 보기를 파괴하는 것이 진정한 변화를 가져 왔습니까? 전체 조각을 다시로드하지 않고 복원하는 좋은 방법이 있습니까? – ben

+0

@ben Detach는보다 친환경적인 접근 방식 인 화면에서 뷰 계층 구조를 제거합니다. 대부분의 뷰는 조각에서 제거 될 때 인스턴스 상태를 저장하는 작업을 잘 수행하므로 다시 연결할 때 큰 문제는 없습니다. –

0

이것이 가능한지 확실하지 않습니다. FragmentManager은 그의 BackStack에서 Fragments에만주의를 기울입니다. 그러나 FragmentActivityonBackButtonPressed을 구현시키고 사용자 지정 동작을 수행하게하는 경우 뒤로 누르는 문제를 해결할 수 있습니다. Fragments에 위임하거나 앱 로직에 따라 다른 Fragment을 표시 할 수 있습니다.

관련 문제