2011-05-07 5 views
0

호환성 라이브러리를 사용하여 코드를 Honeycomb에 이식 중입니다. 미리 이식 된 코드는 다음과 같이 작동합니다. 활동 A, B 및 대화 상자 D1 및 D2가 있습니다. B에는 다른 곳에서 메시지를 수신하는 메시지 처리기가 있습니다.조각에서 호출 할 때 DialogFrament 대화 상자가 잘못된 순서로 표시됩니다.

A는 메시지 (1)에서 showDialog를 호출하여 D1을 표시하는 B를 호출합니다. 그런 다음 사용자가 이미 D1을 기각하지 않은 경우 메시지 (2) 다음과 같은 코드를 사용하여 기각 된 후 D2가 표시됩니다

if (D1.isShowing()) { 
    D1.dismiss(); 
} 

이 잘 작동합니다.

이식 된 코드 A는 Fragment, FB (메시지 처리기 포함)를로드하고 DialogFragment에서 파생 된 D1 및 D2를로드합니다. 대화 상자를 사용하여 표시되도록 내 코드를 수정했습니다 :

dlg.show(fragmentManager, tag); 

위의 검사를 통해 수행됩니다

if (D1.isVisible()) { 
    D1.dismiss(); 
} 

그러나,이 작동하지 않습니다. D2가 먼저 표시되고 나서 해고되면 D1이 표시됩니다. 위의 확인이 이루어질 때 D1이 보이지 않고 D2가 스택의 맨 위에 추가되어 처음 나타나는 이유 (D2의 onCreateView는 D1보다 먼저 호출 됨) 때문에 가정합니다.

는 지금은 아무 소용이 여러 가지를 시도했다 : D1은 스택에있는 경우

1) 트랜잭션 매니저를 받고 확인하여 가시성을 확인합니다. 2)를 사용하여 대화 상자를 표시 : 일종의 않습니다) 이제

FragmentManager fm = fragment.getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.remove(fragment.D1tag).ft.commit();   

3 :

FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.add(0, dlg); 
ft.commit();    

또는 대체 사용/제거 대신 visibity 확인할 때

3) 다음을 수행 추가 그렇지 않은 경우를 제외하고는, 특정의 환경 (예를 들어, 다이얼로그를 조기 해방)으로 fragment가 발견되지 않기 때문에, illegalStateException가 Throw됩니다.

이 문제를 어떻게 해결할 수 있는지 또는 실제로 완전히 잘못된 생각을하고 있는지, 아니면 활동이 대화 상자의 수명주기를 제어해야하는지에 대한 아이디어가 있습니까? 내 벌집 앱 활동 B는 FB를로드하는 래퍼 활동이므로 A와 B의 라이프 사이클 관리 코드를 모두 복제하고 싶지는 않습니다.

미리 감사드립니다. 베드로.

답변

0

여러 개의 막 다른 길 끝에 마침내 내가 만든 메시지 처리기에 다음을 구현하여 조각의 메시지 처리기에 메시지를 게시하고 'show (.. .) '을 선택하면 모든 대화 상자가 표시됩니다.

new Handler().post(new Runnable() { 
    public void run() { 
     FragmentManager fm = fragment.getFragmentManager(); 
     DialogFragment fd = (DialogFragment) fm.findFragmentByTag(d1Tag); 
     if (fd != null) { 
      fm.beginTransaction().remove(fd).commit(); 
     } 
    } 
}); 
관련 문제