2014-12-10 1 views
1

FragmentTransaction의 replace() 메소드가 예상대로 작동하지 않습니다 ...FragmentTransaction의 replace() 메소드가 예상대로 작동하지 않습니다.

1). 조각 f1을 추가하고 커밋했습니다. 2). 조각 f2를 추가하고 커밋했습니다. 3). replace() 메소드를 사용하고 프래그먼트 f3을 사용하여 프래그먼트 트랜잭션 객체에 있던 내용을 대체합니다.

조각 f1 만 제거하지만 조각 f2는 제거하지 않습니다. 그래서 f2와 f3가 보입니다. 내가 기대하는 바는 단편 f3 만 보여야한다는 것입니다.

세로 TextView가있는 LinearLayout을 CONTAINER로 사용하고 있습니다.

답변

0

이것을 사용할 수 있습니다.

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

+0

Backstack을 사용하고 있지 않습니다. –

0

하여 FragmentTransaction의 API reference 바꾸기 방법 것이다 따르면

을 용기에 첨가하여 기존 단편을 대체.

공공 추상적하여 FragmentTransaction 교체 (INT containerViewId, 조각 조각, 문자열 태그)

는 컨테이너에 추가 된 기존의 단편을 교체합니다. 동일한 containerViewId 으로 추가 된 모든 현재 추가 된 조각에 대해 을 호출 한 다음 여기에 주어진 동일한 인수를 사용하여 (int, Fragment, String)을 추가하는 것과 본질적으로 같습니다.

파라미터

  • containerViewId - 그의 단편은 컨테이너의 식별자를 교체한다.
  • fragment - 컨테이너에 배치 할 새 단편입니다.
  • 태그 - 나중에 FragmentManager.findFragmentByTag (String)로 조각을 검색하기 위해 조각의 태그 이름입니다 (선택 사항).

반환

는 동일하여 FragmentTransaction 인스턴스를 돌려줍니다.

기대가 잘못 되었습니까?

+0

여전히 작동하지 않습니다. 특히 ft.replace (R.id.layout, f3, "f2") 호출에서 조각 f2에 대해 태그 [ "f2"]를 전달했습니다. 그런 다음 ft.commit(), 여전히 f2가 표시됩니다. –

+0

그리고 한가지 더. ft.replace()의 세 번째 인수는 바꿀 필요가있는 조각 대신에 추가되는 새로운 조각의 선택적 태그 이름을 참조합니다. –

+1

해결 방법 : API 설명서에서 replace()는 remove()와 add()의 조합으로 작동한다고합니다. 그러나 그것은 사실이 아닙니다. 먼저 remove (Fragment f)를 호출 한 다음 add();를 호출해야합니다. 그것은 작동한다 !!!!! –

0

FrameLayout을 LinearLayout 대신 컨테이너로 사용하십시오.

관련 문제