2013-04-08 3 views
5

응용 프로그램 흐름이 그래픽에 표시되고 다음 텍스트로 설명됩니다.백 스택에서 최상위에없는 조각이 다시 시작됩니다.

Application flow

  1. 조각 1 disallowAddToBackStack 설정하여 가기 backstack 최저 단편뿐만 아니다.
  2. fragmentTransaction.addToBackStack()을 사용하여 조각 2를 스택으로 푸시합니다.
  3. 조각 1의 새 인스턴스가 스택에 푸시됩니다.
  4. 최상위 조각 (조각 1)이 스택에서 팝됩니다.
  5. 활동 2가 전경이됩니다.
  6. 활동 1이 전경이됩니다.

    private void changeContainerViewTo(int containerViewId, Fragment fragment, 
                Activity activity, String backStackTag) { 
    
        if (fragmentIsAlreadyPresent(containerViewId, fragment, activity)) { return; } 
        final FragmentTransaction fragmentTransaction = 
           activity.getFragmentManager().beginTransaction(); 
        fragmentTransaction.replace(containerViewId, fragment); 
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        if (backStackTag == null) { 
         fragmentTransaction.disallowAddToBackStack(); 
        } else { 
         fragmentTransaction.addToBackStack(backStackTag); 
        } 
        fragmentTransaction.commit(); 
    } 
    

    문제

    때 활성 단편 (1)의 최저 인스턴스는 다시 마지막 단계에서 1 명 이력서 :

여기서 I는 단편을 처리 할 때 사용하는 일반적인 방법이다. 이 시점에서 조각 1은 nullgetActivity()에 반환합니다.

질문

  • 왜하지 않은 단편은 스택의 가장 상위는 재개?
  • 조각을 다시 시작하는 것이 올바른 경우 - 분리 된 조각을 어떻게 처리해야합니까?
+0

먼저 Fragment1과 Fragment2는 동일한 컨테이너보기를 사용하며 두 번째 단계에서 사용하는 트랜잭션은 무엇입니까? – Evos

+0

예, 조각 1과 조각 2는 동일한 컨테이너보기를 사용합니다. – JJD

+0

그리고 거래 유형은 "대체", "추가"는 어떻습니까? – Evos

답변

1

(어떻게 설명했는지에 따라) fragmentTransaction.addToBackStack()이 작동하는 방식을 잘못 이해하지 않는 한 어떻게 이런 일이 발생하는지 알 수 없습니다. 조각이 아닌 백 스택에있는 트랜잭션을 관리합니다. 그래서 사용자가 트랜잭션을 반대하고 뒤로 버튼을 눌러 이전 조각을 다시 가져올 수 있으며, 교체 트랜잭션이 다시 스택 에 저장됩니다) (addToBackStack를 호출하여

: 안드로이드 문서에서

.

fragmentTransaction.replace(containerViewId, fragment2); 
fragmentTransaction.addToBackStack(); 
fragmentTransaction.commit(); 

하고 3 단계 :

그래서 당신의 2 단계 코드에서이 같은 보였다 경우이 시점에서

fragmentTransaction.disallowAddToBackStack()//or just no call to addToBackStack - you do not say 
fragmentTransaction.replace(containerViewId, newfragment1); 
fragmentTransaction.commit(); 

을 Fragment2는 가기 backstack에서 제거 될 것입니다 백 스택은 두 개의 Fragment1 인스턴스로 구성됩니다. 4 단계에서 맨 위 팝업이 표시됩니다. 즉 맨 아래쪽에 Fragment1이 있어야합니다.

활동으로 돌아 가면 다시 시작된 단편 인 이유입니다. 그러나 아닙니다, 나는 두려워합니다, 왜 그것의 활동에서 분명히 분리됩니다.

+0

'.replace()'전에'.disallowAddToBackStack()'을 호출하는 것으로 나타났습니다. 내 업데이트 된 질문보기 그게 문제가 될 수 있습니까? – JJD

+1

아니요, 순서는 중요하지 않습니다. 마지막으로 커밋을 호출 할 때까지 사용되지 않는 트랜잭션을 빌드 할 때 설정하는 속성 일뿐입니다. 만약 당신이 현재 같은 것을하고 있다면 – salfon

+0

step2) changeContainerViewTo (containerId, afragment1, activity, null)step3) changeContainerViewTo (containerId, afragment1, activity, null) , null)' 그게 아마 당신이 원하는 일을하지 않을거야 - step2의 태그 param에 null을 전달하고 step3의 tag param에 대해 null이 아닌 값을 전달하려고 시도하십시오. 즉, 트랜잭션에서 대체 된 BEING이 이전 히스토리에 저장하려고 할 때 addToBackStack을 호출하기를 원할뿐입니다. – salfon

2

Activity에 UI가 표시되지 않고 UI가 표시되면 FragmentManager과 관련된 모든 조각이 죽어 가고 상태를 복원해야합니다. documentation

는 말한다 :

이있다 (예를 들면 어떤 UI를 보여주는으로 다시 스택에 배치 때와 같이) 조각은 대부분 철거 할 수있는 많은 상황이지만, 그 상태가 될 때까지 저장되지 않습니다

그것의 소유 활동은 실제로 그 상태를 구해야합니다. 당신의 Activity onSaveInstanceStateonRestoreInstanceState에서

당신에게 Fragment 참조를 저장하고 다음과 같이 뭔가를 복원하려고 :

public void onSaveInstanceState(Bundle outState){ 
    getFragmentManager().putFragment(outState,"myfragment", myfragment); 
} 
public void onRetoreInstanceState(Bundle inState){ 
    myFragment = getFragmentManager().getFragment(inState, "myfragment"); 
} 

이를 시도하고 운이! :-)

1

안드로이드 OS는 조각이 적당 할 때 조각을 만들어 파괴 할 수 있습니다. 이것은 활동 2를 실행하고 활동 1로 돌아갈 때 일어날 가능성이 높습니다. 활발히 표시되는 부분이 아닌지 확실히 확인합니다. 아마도 조각 2에 대한 생성 단계를 수행하기 전에 조각 1에 대한 생성 단계 중 일부를 수행하고있는 것을 볼 수 있습니다.

분리 된 조각을 처리하는 방법은 page을 참조하십시오. 그 중점은 특정 조각 함수에서만 getActivity를 사용해야한다는 것입니다 (fragment life cycle 기준). 이것은 일부 논리를 다른 기능으로 이동해야 함을 의미합니다.

관련 문제