2

안녕하세요, 다른 Android 개발자,Wizard like DialogFragment-Chain

두 개의 DialogFragments를 연속적으로 사용하려고합니다. 따라서 두 번째 DialogFragments가 취소되면 두 번째 팝업 창이 취소됩니다. 이 취소됩니다 감지

내 DialogFragment에서
void showFirstDialog() { 
     // Pass the context to do a callback 
     DialogFragment newFragment = ChangeDialogFragment.newInstance(mContext); 
     newFragment.show(getSupportFragmentManager(), "myFirstDialogTag"); 
    } 

나는 다음 한 코드 :

나는 다음과 같은 방법을 호출 내 활동에

: 여기

는 내가 지금까지 무엇을 가지고
@Override 
    public void onCancel(DialogInterface dialog) { 
      // Use Context to do a callback and inform the Activity that 
      // Fragment is cancelled 
     ((Activity) mContext).firstDialogCanceled(); 
     super.onCancel(dialog); 
    } 

내 활동으로 돌아가서 두 번째 대화 상자를 시작하여 해당 이벤트에 반응합니다.

void firstDialogCanceled { 
     DialogFragment newFragment = InformationDialogFragment.newInstance(); 
     newFragment.show(getSupportFragmentManager(), "mySecondDialogTag"); 
    } 

첫 번째 대화 상자에서 오리엔테이션을 변경하지 않는 한 완벽하게 작동합니다. 나는 일이있을 때 나는 다음과 같은 오류 얻을 :

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

이 예외가 라인에 발생을 "newFragment.show (에서 getSupportFragmentManager(),"mySecondDialogTag ");"

이 문제를 해결할 수있는 방법은 처음 대화 상자를 수동으로 닫는 것입니다. 나는 다음과 같이 시도했다 :

DialogFragment firstFragment = (DialogFragment) getSupportManager().findFragmentByTag("myFirstDialogTag"); 
firstFragment.dismiss(); 

다시 방향을 바꾸지 않고 모든 것이 잘 동작한다. 첫 번째 대화 상자가 화면에 표시되는 동안 오리엔테이션을 변경하면 "firstFragment.dismiss()"줄에 NullPointerException이 발생합니다.

왜 그런 일이 발생합니까? 왜 FragmentManager는 오리엔테이션 변경 후 DialogFragment를 잊어 버리고 왜 두 번째 것을 표시 할 수 없습니까? Android 레퍼런스는 다음과 같이 말합니다.

you should use show(FragmentManager, String) or show(FragmentTransaction, String) to add an instance of DialogFragment to your UI, as these keep track of how DialogFragment should remove itself when the dialog is dismissed.

나는 쇼를 사용하지만 여전히 제대로 작동하지 않습니다.

모든 힌트를 높이 평가합니다!

건배 Ali3n

+3

I는 I가 발생 한 시간 "onSaveInstanceState 후이 작업을 수행 할 수 없습니다"고 말할 수 있습니다 구성 변경으로 인해 새로 작성된 활동 인스턴스가 아니라 이전/파괴 된 활동 인스턴스에 적용됩니다. – CommonsWare

+0

당신은 나의 영웅입니다. 답변으로 게시하여 받아 들일 수 있습니다. –

답변

2

당신은 당신의 대화 조각에 활동의 이전 인스턴스를 사용하고 있습니다. 현재 활동을 mContext으로 newInstance 방법으로 전달하고있는 것 같습니다. 방향 또는 키보드와 같은 구성 변경 후이 컨텍스트 개체는 유효하지 않게되고 더 이상 모든 창에 연결되지 않습니다. 내가 뭔가를하려고 노력했기 때문에

당신이에 살고있는 현재의 활동을 얻기 위해 FragmentDialoggetActivity() 방법을 사용할 수 있습니다

.