2015-02-02 1 views
0

나는 안드로이드에서 매우 이상한 문제를 겪고 있는데, 왜 일어나는 지 또는 어떻게 코딩 하는지를 알 수 없다. 나는 이것이 진정으로 안드로이드 버그라고 생각한다.안드로이드에서 FragmentManagerImpl.dispatchResume()가 조각을 재개 함

MainActivity에는 main_container라는 이름의 FrameLayout이 있습니다 (높이와 너비가 모두 match_parent이므로 각 조각이 사용자에게 "보여주는"유일한 조각이어야 함).

거기에서
mFragmentManager.beginTransaction() 
     .replace(R.id.main_container, frag, fragTag) 
     .commit(); 

, 조각 A, 뷰의 사용자의 클릭에, 그래서 ("파편"와 같은 조각 B를 추가하고 "fragTag"는 다른 값은 다음과 같습니다 MainActivity에서, 나는과 같이 프래그먼트 추가 위의 코드 조각) :

mFragmentManager.beginTransaction() 
     .setCustomAnimations(R.anim.slide_in_right, 0, 0, R.anim.slide_out_right) 
     .add(R.id.main_container, frag, fragTag) 
     .addToBackStack(null) 
     .commit(); 
:
mFragmentManager.beginTransaction() 
     .setCustomAnimations(R.anim.slide_in_right, 0, 0, R.anim.slide_out_right) 
     .add(R.id.main_container, frag, fragTag) 
     .addToBackStack(null) 
     .commit(); 

그리고 여기에서

이, 조각 B가, 다시 (과 같이 조각 C를 추가 할 것 "파편"와 "fragTag"앞의 두 조각과는 다른 값)입니다

그래서이 시점에서, 나는 백 스택에서 조각 A -> 조각 B -> 조각 C가 있어야합니다.

조각 C는 사용자가보기를 클릭하면 MediaPicker를 호출합니다. 그렇게하면 모든 파편의 onPause 메서드가 호출되고 앱이 백그라운드로 실행됩니다. 이제 사용자가 이미지를 선택하면 응용 프로그램이 다시 시작되지만 여기에서 버그가 발생합니다 ... 각 조각의 onResume 메서드에서 중단 점이있는 것으로 확인되면이 순서대로 다시 시작됩니다.

조각 A -> 조각 C -> 조각 조각 B

각 조각이 다시 버튼 클릭을 처리하기 위해 MainActivity의 수신기로 등록되므로 모든 문제가 발생합니다. 이 논리는 올바른 순서에 의존합니다. 웬일인지, 그것은 조각 C를 정상에 아직도 보이고있다. 그러나 onResume는 틀린 순서로 명확히 불렸다.

아마도 MediaPicker를 클릭하는 것보다 ... 설정 변경을 유발하기 위해 전화기를 돌릴 수도 있습니다. 이것은 A -> C -> B로 재정렬하는 것과 동일한 동작을 나타내지 만,이 경우 실제로 잘못된 조각이 위에 표시됩니다. 조각 B가 맨 위에 표시됩니다.

backstack에 추가 한 순서와 동일한 순서로 조각을 다시 시작할 수있는 안드로이드에 의존 할 수없는 디자인 포인트입니까? 주위를 코딩해야합니까? 아니면 내가 잘못하고있는거야? 아니면 이것은 정말로 안드로이드 버그입니까? 나는 안드로이드 개발에 초보자가 아니지만,이 하나는 저를 곤란하게합니다.

편집 :

내가 무슨 일이 일어나고 있는지 정확히 지적했고 분명히으로 설계된입니다. 그것은 나에게 꽤 미친 것처럼 보이고 그 뒤에있는 논리에 동의하지 않습니다. 리플렉션을 사용하여이 문제를 해결할 수도 있지만 그렇게하는 것을 좋아하지 않습니다. 어쨌든, 문제에.

문제는 FragmentManagerImpl이 활성 조각을 추적하는 방식에 있습니다. 그것은 ArrayList 활성 조각을 추적하고 모든 경우 (예 : 미디어 갤러리에서 사진을 얻으려는 의도를 시작한 나의 경우와 같이 내 앱을 떠날 때), 내 앱으로 다시 시작할 때, 그것들은 그 ArrayList에있는 same order에있는 프래그먼트를 다시 활성으로 이동시킵니다. 멋지 네요?

여기 내 문제가 있습니다.해당 ArrayList 밖으로 물건을 가져올 때 그들은 항목을 제거하지 않습니다(), 그들은 그냥 null로 설정하고 다음 조각을 따라 올 때 해당 빈 "슬롯"(github 링크의 줄 1168) 다시 논리를 가질 수 있습니다. . 필자의 경우, ArrayList에 구멍을 남기는 일시적인 조각은 DialogFragment입니다. DialogFragment ... DialogFragment의 특정 버튼을 클릭하면 B 조각이 나타납니다. Fragment B의 다른 뷰를 클릭하면 Fragment C가 나타납니다. 그러나 ArrayList FragmentManagerImpl의 결과는 다음과 같습니다. 의 트랙 DialogFragment의 버튼을 클릭 한 후 :

{프라 널 (DialogFragment로 사용) FragB}

FragB가 액티브로 이동 후 DialogFragment가 액티브 상태로부터 이동 그래서 명백하게 따라서 떠나 구멍. 그래서 지금 우리가 FragC를 불러옵니다 FragB에서보기를 클릭하고 ArrayList를 그래서 다음과 같습니다

우리는 미디어 선택기에 꺼

{프라, FragC (DialogFragment의 슬롯을 재사용), FragB가}, 돌아와, 그리고 그 조각들은 내가 처음에 그것들을 어떻게 인스턴스화했는지에 관해 순서가 맞지 않게 재개된다. 이것은 나에게 의미가 없으며, 중단 점이있는 OS 코드를 실행하지 않으면 안드로이드가 당신이 말한대로 행동하지 않는 이유를 결코 알 수 없습니다. 제거한 프래그먼트의 ArrayList.remove()를 수행하는 것이 더 쉬워 졌으므로 구멍이 남지 않았습니다.

내가 말했듯이, 아마도 이것을 리플렉션으로 해결할 수는 있지만, 그 ArrayList의 슬롯 인덱스에 해당하는 모든 Fragments에이 mIndex 변수가 있기 때문에 걱정할 필요가 없습니다 (mActive) . 따라서 이들을 동기화 상태로 유지해야합니다 ... 이제 OS 코드가 어떻게 작동하는지 알 수있는 의존성이 있습니다. :(

답변

0

는이. 구글 "안드로이드 조각 재정렬"알려진 문제이며 당신은 어떤 솔루션을 포함한 주제에 대한 링크의 전체 페이지를 얻을 것이다.

+0

내가 그 검색에서 무엇을 얻을의 대부분은 순서를 변경하는 방법 당신의 backstack. 나는 그것을 재정렬하고 싶지 않다. 실제로 무슨 일이 일어나고 있는지 정확히 지적 했으므로 나는 그 정보로 나의 질문을 편집 할 것이다. – pdub

관련 문제