2012-02-08 10 views
30

런타임 중에 다른 대화 상자를 보여줄 수있는 활동이 있습니다. onCreateDialog (int id)를 사용하여 각 대화 상자를 만들고 showDialog (int id) 및 dismissDialog (int id) 메서드를 사용하여 각 대화 상자를 표시하고 닫습니다.안드로이드 - onPause의 모든 대화 상자를 닫는 방법

onPause()가 호출되면 어떤 대화 상자 (있는 경우)가 표시되는지 알 수 없습니다. onPause가 호출 될 때 모든 대화 상자가 흐트러 지도록하고 싶습니다. 모든 대화 상자를 닫을 수있는 권장 방법이 있습니까? 각 대화 상자마다 dismissDialog()를 호출해야합니까?

+0

을 내가 업데이트 한 대답 – quinestor

답변

12

우리가 말하는 대화 상자의 수에 따라 다릅니다. 간단히 대답하면 네, 각 대화 상자를 닫아야합니다.

활동 레벨에서 몇 개의 대화 상자를 선언하는 것 외에는 우아한 방법이있을 수 있습니다. 선언 된 모든 대화 상자를 HashMap에 저장 한 다음 목록을 반복하고 각각의 onPause를 닫을 수 있습니다.

어떤 것이 열려 있는지 모르기 때문에 상태를 테스트하고 추적해야합니다.

그러나 실제로 화면에이 대화 상자가 많은 경우 UI 디자인과 관련하여 몇 가지 문제가있을 수 있습니다. 안드로이드는 디자인이 좋지 않은 것처럼 쉽게 구현할 수있는 모델을 제공해야합니다. 대화 상자가 단순히 자신의 라이프 사이클를 사용할 수있는 조각 용기를 가지고 것이기 때문에 DialogFragment 컨테이너를 사용하는 방법에 대한 안드로이드의 최근 중시

+6

을 또한, 폐쇄 대화 상자를 기각에서 오류를 입지 않도록, 당신은 시도 - 캐치를 모든 사용할 수 있습니다 대화를 닫을 때. 열린 대화 상자를 확인하는 것보다 코드 작성이 훨씬 쉽습니다. – Arci

7

당신은

에 기각 호출 할 필요가 없습니다 줘야 해. 이 DialogFragment를 고려

public class FragDialog extends DialogFragment{ 

    public ProgressDialog _dialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     if (savedInstanceState != null) { 
      //this.dismiss();  <-- The dialogs may be dismissed here 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(final Bundle savedInstanceState) { 

     _dialog = new ProgressDialog(getActivity()); 
     return _dialog; 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     // <--------- You may overload onPause 
    } 
} 

이처럼 호출 일반적으로 fragmentmanager를 사용하여 활동에 표시됩니다 어떤 : 당신이 실제로 DialogFragment가 onPause에서 무엇을 변경할 수 있습니다

FragmentManager fm = getSupportFragmentManager(); 
FragDialog fragDialog = new FragDialog(); 
fragDialog.show(fm, "my_tag"); 

참고. 활동이 onPause를 호출하면이 onPause도 호출됩니다.

작업이 다시 시작되면 this.dismiss()를 사용하여 onPause() 대화 상자를 닫아도 작업이 수행되지 않습니다. 대화 상자를 다시 시작하기 때문입니다. (이것은 savestate가 onPause 이전에 저장 되었기 때문에 발생한다고 생각합니다.)

그러나 코드에 표시된 것과 같이 savedInstanceState (이력서)를 감지하면 onCreate에서 대화 상자를 안전하게 닫을 수 있습니다.

+0

이것은 깔끔한 해결책이며 여전히 2018 년에 일하고 있습니다. 감사합니다! – Micer

12

당신이 DialogFragment를 사용하는 경우 당신은 당신이 사용할 수있는 모든을 기각 할 :

/** 
* Dismiss all DialogFragments added to given FragmentManager and child fragments 
*/ 
public static void dismissAllDialogs(FragmentManager manager) { 
    List<Fragment> fragments = manager.getFragments(); 

    if (fragments == null) 
     return; 

    for (Fragment fragment : fragments) { 
     if (fragment instanceof DialogFragment) { 
      DialogFragment dialogFragment = (DialogFragment) fragment; 
      dialogFragment.dismissAllowingStateLoss(); 
     } 

     FragmentManager childFragmentManager = fragment.getChildFragmentManager(); 
     if (childFragmentManager != null) 
      dismissAllDialogs(childFragmentManager); 
    } 
} 
+0

DialogFragment에 대해 지금까지 가장 깨끗한 솔루션처럼 보입니다. 프로덕션 앱에서 사용하고 있습니까? –

+0

@ grub- 예, 있습니다. –

관련 문제