7

다음은 태블릿에서 수행 할 응용 프로그램을 원합니다. Fragment0 결코 이동하지Android 조각을 다른 컨테이너로 이동합니다. 조각의 컨테이너 ID를 변경할 수 없습니다.

----------------- 
| | | | | 
| | | | | 
|(0)| X | X | X | 
| | | | | 
| | | | | 
----------------- 
becomes 
----------------- 
| | | | | 
| | | | | 
|(0)|(1)| X | X | 
| | | | | 
| | | | | 
----------------- 
and then 
----------------- 
| | | | | 
| | | | | 
|(0)|(2)|(1)| X | 
| | | | | 
| | | | | 
----------------- 
etc... 

가, 다른 사람이 오른쪽으로 이동됩니다 조각 (0)이 같은 조각 (1) ... (N)을 표시 할 몇 가지 메뉴가 있습니다. 오른쪽 가장자리에서 떨어져 나가는 파편은 파괴 될 것입니다.

그래서 내가 설정 내 XML의 그때 fragment1 인스턴스화 및 디스플레이 fragment0 수

적절한 아이디 (fragment0 ... fragment3)와 수평의 LinearLayout 및 포함 4 FrameLayout이와 레이아웃,하지만 난 이동할 수 없습니다입니다 ,

ERROR/AndroidRuntime(343): FATAL EXCEPTION: main 
java.lang.IllegalStateException: Can't change container ID of fragment ... 

내가 찾은 유일한 관련 질문 this onethat one있는 행운과 함께 제공하는 모든 다른 솔루션을 시도 : 그것은 오른쪽에, 내가 얻을. .add() 다음에 시도 FragmentTransaction.remove()

는 다른 순서를 시도하고 (심지어 누군가가 제안을 두 번으로 저지하려고)을 통해 절반 방법을 커밋, .replace()을 시도 addToBackStack() ... 여전히 행운을 호출했습니다.

FragmentTransaction을 사용하여 이러한 조각을 이동할 수 있는지 여부는 질문입니다. 그렇다면, 내가 뭘 잘못했는지 (그리고 보너스, 그게 가능합니까?). 그렇다면 이것을 구현하는 올바른 방법은 무엇입니까?

매번 조각을 다시 인스턴스화하고 싶지는 않습니다 (각각 시간이 걸릴 수있는 웹에서 일부 쿼리를 수행함). 그것은 하나를 다시 활동에 다시 모든 데이터를 추출하는 것이 가능하지만 오히려

답변

3

... 가능하면 나는 이것이 당신이 원하는 꽤 무엇을 알고하지 않는 것이하지 거라고하지만 난 약간의 샘플을 만든 너의 문제에 관해서. 기본적으로 레이아웃 파일을 사용하여 오른쪽 시프 팅을 수행하고 각 시프 팅 프래그먼트에 대한 래퍼 컨테이너를 갖게됩니다. 코드 샘플은 대답을 위해 약간 크지 만 a gist that you can find here에 게시했습니다. 해당 샘플에서 ListFragment의 각 항목 (조각 1 -> 조각 2 -> 조각 3)을 눌러 동작을 확인합니다. 단편의

+0

내가 찾고있는 것을하지는 않지만 코드를 변경하려고합니다 ... 내가 할 수 있으면 게시 할 것입니다 ... – Matthieu

+0

내가 필요한 것을 할 수있었습니다. 내 변경 사항을 작성한 요지로 푸시하는 방법을 알 수 없으므로 여기에 설명을 추가합니다. https://gist.github.com/4166640 – Matthieu

+0

실례합니다. 그건 typo이며,'frag_fragaccordion.xml'에서'RelativeLayout' 대신'LinearLayout'이어야합니다? – midnite

20

예 컨테이너 remove() 기능을 이용하여 변경 될 수있다. 여기

문제는 commit()입니다. 그것은 비동기 호출이며, 메인 스레드에 있도록 스케쥴합니다. 그래서 다른 컨테이너에 추가하기 전에 즉시이 작업을 수행 할 FragmentManager을 강제로.

이 경우 우리는 executePendingTransactions() 기능을 사용해야합니다. 새 컨테이너에 조각을 추가하는이 시도를 호출 후.

문서 : executePendingTransactions()

코드 샘플 :

FragmentManager fManager = getSupportFragmentManager(); 
FragGroups fragGroups = (FragGroups) fManager.findFragmentByTag("groups"); 
if (fragGroups != null) { 
    fManager.beginTransaction().remove(fragGroups).commit(); 
    fManager.executePendingTransactions(); 
} else { 
    fragGroups = new FragGroups(); 
} 
if (mTwoPane) { 
    fManager.beginTransaction().replace(R.id.fragment_container_groups, fragGroups, "groups").commit(); 
} else { 
    fManager.beginTransaction().replace(R.id.fragment_container, fragGroups, "groups").commit(); 
} 

을 즐길 수 있습니다.피드 - 백 내가 여기에 포인트를 추가하려는

편집

을 환영합니다. 동일한 문제가 있었으므로이 스레드로 이동하여 제안 된 변경 사항을 적용했습니다. 문제는 여전히 지속됩니다. 그럼 내 문제를 해결이 스레드 아래 마지막 코멘트로 보았다 : 트랜잭션을 커밋하는 동안 addToBackStack() 메서드를 제거하거나 의도적으로 그것을 사용하는 경우 다른 컨테이너에 추가하기 전에 다시 스택 조각을 제거하십시오. 희망은 미래의 독자들에게 도움이 될 것입니다.

+1

우수 답변! 원래의 질문이 찾고 있던 것이 정확하지 않을 수도 있지만 매우 유용한 것으로 나타났습니다. –

+2

파반 ..... 나는 네가 누군지조차 모르는 데 .... 너는 나를 모른다조차도 ....하지만 너에게 진지한 사랑이있다, 친구. – dell116

+0

@TomR 나는 그것이 유용하다는 것을 알게되어 기쁘다. :) –

관련 문제