2013-03-27 9 views
21

안드로이드 타블렛 애플리케이션의 경우 2 개의 프래그먼트를 사용합니다. 하나는 화면의 왼쪽에, 다른 하나는 오른쪽에 있습니다. 오른쪽 단편에서 버튼을 클릭하면 다른 단편이 오른쪽 단편 상단에 추가됩니다. 이 단편은 백 스택에 추가됩니다.안드로이드 백 스택에서 하나의 특정 프래그먼트 삭제

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.add(R.id.fragmentlayout, fragment2); 
ft.addToBackStack("Fragment2"); 
ft.commit(); 

가기 backstack 해주기이다

[단편 1] -> 좌측의 [단편 2

는 동일한 좌측 단편 위에 단편을 여는 버튼 (인 fragment2로) 그리고 그것을 백 스택에 추가합니다. 단편 2에서

그 단편을 닫기위한 버튼이다> [단편 3] -> [2 단편 - 상기 가기 backstack 해주기

[단편 1]이다.

getFragmentManager().popBackStack("Fragment2", FragmentManager.POP_BACK_STACK_INCLUSIVE); 

문제는 단지 [조각 2]를 닫고 싶을 때 [조각 3]도 파괴됩니다. 나는

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
ft.remove(fragment2).commit(); 

를 호출하여 조각을 수동으로 실시 제거 할 수 있습니다하지만 가기 backstack는

[조각 1] 남아 -> [(유령) 조각 2] -> [단편 3]

그래서 당신이 필요로하는 한 번 더 누르면 응용 프로그램을 닫을 수 있습니다.

[조각 2] 만 백 스택에서 제거하고 [조각 3]을 화면에 남겨 둘 수 있습니까?

+4

AFAIK, 불가능합니다. 이것이 스택이라고하는 이유입니다. –

+0

빈 조각으로 대체하여 이전 조각을 제거해야합니다. 그러면 단편 3을 떠날 수 있습니다. – GrIsHu

답변

5

간단히 자신의 백 스택을 만들고 onBackPressed()을 덮어 쓰면 어떤 방식 으로든 처리 할 수 ​​있습니다. 나는 원하는 행동을 성취 할 다른 방법이 없다고 생각합니다.

자신의 백 스택은 조각에 대한 태그의 ArrayList 일 수 있습니다.

0

이 솔루션은 귀하의 경우에만 작동합니다. Fragment2를 백 스택에 넣을 필요가 없습니다. 'ft.addToBackStack ("Fragment2");'코드를 제거하면됩니다. Fragment2가 스택에 없습니다. 따라서 Fragment2를 닫고 [조각 3]을 화면에 남겨 둡니다.

1

방금 ​​비슷한 질문을 했으므로 here's a link to that answer.

구현은 아무 곳이나 가기 backstack에서에서 Fragment을 제거 할 수 있으며이 FragmentManagerImplBackStackRecord에 가기 backstack 정보를 저장하는 내부 변수를 수정 refrection를 사용하여 얻을 수있다.

비록 사용을 권장하지 않지만 도움이되기를 바랍니다.

0

자신 만의 조각 관리자/관찰자를 만들 수 있습니다. 그것은 단지 간단한 목록 또는 내부지도 일 것입니다. 태그 또는 단순히 클래스 이름 (getClass)을 사용하여 추적하십시오. 이렇게하면 새로운 조각 생성을 피하고 캐시 된 조각을 다시 사용하여 메모리 사용을 제어 할 수 있습니다. 당신은 또한해야 할/할 수있는 방법을 사용하는 대신 원하는 방식으로 조각을 조작 할 수 있습니다 (onBackPressed를 무시하고 좋아하는 조각을 푸시).

관련 문제