Programing

응용 프로그램이 백그라운드에있는 동안 DialogFragment를 닫는 적절한 방법

crosscheck 2020. 11. 20. 08:39
반응형

응용 프로그램이 백그라운드에있는 동안 DialogFragment를 닫는 적절한 방법


DialogFragment를 사용하기 시작했습니다. 방향 변경 등을 통해 잘 작동하기 때문입니다. 그러나 내가 만난 불쾌한 문제가 있습니다.

나는이 AsyncTask쇼 DialogFragment 및 일축를 진행 것을 onPostExecute. onPostExecute응용 프로그램이 백그라운드에 있을 때 (예 : 홈 버튼을 누른 후)를 제외하고는 모든 것이 잘 작동합니다 . 그런 다음 DialogFragment 닫기- " Can not perform this action after onSaveInstanceState" 에서이 오류가 발생했습니다 . 도. 일반 대화 상자는 잘 작동합니다. 그러나 FragmentDialog는 아닙니다.

그래서 응용 프로그램이 백그라운드에있는 동안 DialogFragment를 닫는 적절한 방법은 무엇입니까? 저는 Fragments를 많이 사용하지 않았기 때문에 뭔가 빠진 것 같습니다.


DialogFragment 라는 메서드가 있습니다 dismissAllowingStateLoss()


이것이 내가 한 일입니다 (df == dialogFragment).

다음과 같이 대화 상자를 호출해야합니다.

df.show(getFragmentManager(), "DialogFragment_FLAG");

대화 상자를 해제하려면 다음을 확인하십시오.

if (df.isResumed()){
  df.dismiss();
}
return;

조각의 onResume () 메서드에 다음이 있는지 확인하십시오 (df 아님).

@Override
public void onResume(){
  Fragment f = getFragmentManager().findFragmentByTag("DialogFragment_FLAG");
  if (f != null) {
    DialogFragment df = (DialogFragment) f;
    df.dismiss();
  }
  super.onResume();
}   

이런 식으로 대화 상자가 표시되면 닫힙니다 .. 표시되지 않으면 대화 상자가 취소되고 조각이 표시됩니다 (onResume) ...


이것이 내가 원하는 것을 달성하기 위해해야하는 fragment_RedemptionPayment일입니다. 맨 위에 전역 적으로 선언 된 이름의 대화 조각을 표시하는 Fragment 활동 이 있습니다. 다음 코드 DialogFragment는 활동이 백그라운드로 이동하고 포 그라운드로 돌아 오기 전에 표시 되는 경우를 닫습니다.

     @Override
        public void onResume() {
            super.onResume();        
            if(fragment_RedemptionPayment.isVisible()){
                fragment_RedemptionPayment.dismiss();
            }
}

작동 할 수있는 해결책은 Fragment.setRetainInstance(true)dialogfragment에서 설정 하는 것이지만 가장 좋은 수정은 아닙니다.

때때로 프레임 워크가 상태를 먼저 복원 할 수 있도록 대화 작업을 대기열에 추가해야한다는 사실을 알게되었습니다. 현재 Looper를 잡고 (Activity.getMainLooper())Handler로 감쌀 수 있다면 해당 큐에 실행 파일을 게시하여 큐의 뒤쪽으로 해고를 전달할 수 있습니다.

나는 자주하는 별도의 조각 사용하게 retaininstance(true)그가있다을 ResultReceiver. 따라서 결과 수신기를 내 작업에 전달하고 onReceive에서 콜백을 처리합니다 (종종 다른 수신기의 라우터로 사용). 그러나 비동기 작업을 사용하는 경우 가치보다 약간 더 많은 작업이 될 수 있습니다.

참고 URL : https://stackoverflow.com/questions/9325238/proper-way-of-dismissing-dialogfragment-while-application-is-in-background

반응형