2016-12-29 1 views
1

지원 라이브러리의 조각으로 앱을 개발합니다. 나는 하나의 활동만을 사용한다. 레이아웃은 축소 도구 모음 레이아웃이있는 코디네이터 레이아웃과 탐색보기로 구성됩니다. 나는이 (가) NavigationItemSelectedListener에서 다음을 실행 탐색 항목 선택시 : 새 항목을 선택할 때 onResume이 "죽은"조각에 대해 호출되었습니다. 올바르게 복구하는 방법은 무엇입니까?

switch (item.getItemId()) { 
       default: 
        return false; 
       case R.id.mainmenu_start: 
        navi.clear(); 
        navi.navigate(new StartFragment(), R.id.fragment_container); 
        return true; 
       // ... More menu entries 
      } 

그래서 나는 가기 backstack ( navi.clear())을 삭제하고 새 것으로 표시된 조각을 교체합니다.

내가 가지고있는 문제는 다음과 같습니다. "이전"(대체 된) 조각 은 삭제/분리되지 않음. 나는 StartFragment로 이동하면

그래서, 다음 다른 단편으로 이동 한 후 다시 StartFragment을 선택 onResume 두 번 호출됩니다 : 새로 하나를 생성
번/처음 StartFragment "오래된"에, 한 번에.

이 동작을 어떻게 피할 수 있습니까? 또는은 기존 조각을 재사용하고 싶지만 두 가지 모두를 사용하면 큰 문제가 발생합니다 ...

각 조각에 고유 한 (증분) ID를 부여했습니다. 새로운 Fragment로 이동하면 onResume은 여러 개의 이전 Fragment에서 호출되지만 모든 Fragment에서는 호출되지 않습니다.
예 : 나는 항상 탐색을 위해 동일한 메뉴 항목을 선택합니다. 2 다시 시작,

  1. 만들기 1, 1을 다시 시작, 1
  2. 2 작성 이력서 :이 수는 (조각을 모두 같은 클래스 (StartFragment)이다)을 조각 ID를 나타내는 "사건"발생하는이다
  3. 1, 다시 시작, 3 만들기 3
  4. 4 작성 이력서, 2를 다시 시작, 3을 다시 시작,

4 그래서 때로는 "오래된"조각이 누락를 다시 시작하고 나중에 다시. onResume은 때로 완전히 다른 부분에서 호출되기도합니다. AS를

public void clear() { 
    FragmentManager fragmentManager = ((MainActivity)context).getSupportFragmentManager(); 
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 



public void navigate(Fragment fragment, int container, HashMap<String, Pair<String, View>> sharedElements) { 
    this.hideKeyboard(); 
    FragmentTransaction ft = ((MainActivity)context).getSupportFragmentManager().beginTransaction(); 
    ft.replace(container, fragment); 
    ft.addToBackStack(null); 
    ft.commit(); 
    ((MainActivity)context).getDrawerLayout().closeDrawers(); 
} 
+1

먼저 생각하여이 특별한 경우 중 하나를 달성 할 수있다 : 당신이 popBackStackImmediate 대신 popBackStack를 시도? 차이가 있습니까? –

+1

감사합니다 :) 이것은 올바른 해결책 인 것 같습니다! 어쩌면 당신은 대답으로 이것을 게시하고 싶습니다. 그래서 그것을 받아 들일 수 있습니다 – Kryptur

+0

물론, 나는 그것을 별도의 답변으로 다시 게시 할 것입니다. –

답변

1

게시 : 완성도를 들어


탐색 기능 (그래서 ... 새로운 조각 하나를 만들 때 이전, 조각 2 onResume이라고도 조각 2를 열 때) 나중에 참조 할 수 있도록 대답하십시오.

나는 popBackStack()이 즉각적인 효과가 없지만 다음 이벤트 루프 패스에서 실행되도록 예약되어 있다고 생각합니다. 귀하의 경우에는 너무 늦어 원하지 않는 결과가 발생합니다. 도움이 될만한 점은 조각 관리자의 거래가 즉시 완료되어야한다는 것입니다.

그것은 executePendingTransactions()를 호출하거나 popBackStackImmediate()

관련 문제