DialogFragment를 올바르게 닫는 방법은 무엇입니까?
문서 dismiss()
는 Dialog
클래스 의 메소드에 대해 다음과 같이 말합니다 .
이 대화 상자를 닫고 화면에서 제거합니다. 이 메서드는 모든 스레드에서 안전하게 호출 할 수 있습니다. 대화 상자가 닫힐 때 정리를 수행하기 위해이 메서드를 재정의해서는 안되며 대신
onStop()
.
내 코드에서 내가하는 일은 getDialog().dismiss()
그것을 기각하는 것 뿐이다. 그러나 나는 다른 일을하거나 사용하지 않습니다 onStop()
. 그래서 DialogFragment
메모리 누수 등을 피하기 위해 a 를 올바르게 해제하는 방법을 정확히 묻고 있습니다 .
tl; dr : a를 닫는 올바른 방법 은 DialogFragment에서 직접DialogFragment
사용 dismiss()
하는 것 입니다.
세부 정보 : DialogFragment 상태 문서
대화 상자를 직접 호출하는 것이 아니라 여기에서 API를 통해 대화 상자를 제어 (표시, 숨기기, 닫기시기 결정)해야합니다.
따라서 대화 상자에서getDialog().dismiss()
호출되므로을 사용해서는 안됩니다 . 대신 DialogFragment 자체 의 메서드를 사용해야합니다.dismiss()
dismiss()
공개 무효 dismiss ()
조각과 대화 상자를 닫습니다. 조각이 백 스택에 추가 된 경우이 항목을 포함한 모든 백 스택 상태가 표시됩니다. 그렇지 않으면 조각을 제거하기 위해 새 트랜잭션이 커밋됩니다.
보시다시피, 이것은 대화 상자를 닫을뿐만 아니라 프로세스와 관련된 프래그먼트 트랜잭션을 처리합니다.
onStop
수동 정리 (파일 닫기, 커서 닫기 등)가 필요한 리소스를 명시 적으로 만든 경우 에만 사용해야 합니다. 그럼에도 불구 하고 기본 대화 상자가 onStop
아닌 DialogFragment를 재정의 합니다 onStop
.
a를 닫는 더 좋은 방법 DialogFragment
은 다음과 같습니다.
Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog");
if (prev != null) {
DialogFragment df = (DialogFragment) prev;
df.dismiss();
}
이렇게하면에 대한 참조를 유지할 필요가 없으며 DialogFragment
모든 곳에서 닫을 수 있습니다.
나는 Terel의 답변에 찬성 투표를했습니다. Kotlin 사용자를 위해 이것을 게시하고 싶었습니다.
supportFragmentManager.findFragmentByTag(TAG_DIALOG)?.let {
(it as DialogFragment).dismiss()
}
이 코드 만 사용하는 것은 어떨까요?
dismiss();
자체적으로 Dialog Fragment를 닫으려는 경우. 이 코드를 대화 상자를 닫으려는 대화 조각 안에 간단히 넣을 수 있습니다.
예를 들면 :
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
그러면 화면에 표시된 최근 대화 조각이 닫힙니다.
도움이되기를 바랍니다.
당신은 당신을 해고해야 Dialog
에 onPause()
그래서 우선합니다.
또한 닫기 전에 null
아래 스 니펫과 같이 확인할 수 있으며 표시됩니다.
@Override
protected void onPause() {
super.onPause();
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
Kotlin 버전 의 Terel 답변
(fragmentManager.findFragmentByTag(TAG) as? DialogFragment)?.dismiss()
해제하려는 조각에서 dismiss ()를 호출하면됩니다.
imageView3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
다른 답변 에는 공식 문서 ( DialogFragment Reference )에 대한 참조가 있지만 거기에 제공된 예제에 대한 언급은 없습니다.
void showDialog() {
mStackLevel++;
// DialogFragment.show() will take care of adding the fragment
// in a transaction. We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
newFragment.show(ft, "dialog");
}
이렇게하면 현재 표시된 대화 상자가 제거되고 인수가있는 새 DialogFragment가 만들어지고 백 스택에 새 상태로 표시됩니다. 트랜잭션이 팝되면 현재 DialogFragment 및 해당 Dialog가 파괴되고 이전 DialogFragment (있는 경우)가 다시 표시됩니다. 이 경우 DialogFragment는 Dialog의 트랜잭션을 팝핑하는 것을 처리 할 것이며 Dialog와는 별도로 해제됩니다.
For my needs I changed it to:
FragmentManager manager = getSupportFragmentManager();
Fragment prev = manager.findFragmentByTag(TAG);
if (prev != null) {
manager.beginTransaction().remove(prev).commit();
}
MyDialogFragment fragment = new MyDialogFragment();
fragment.show(manager, TAG);
참고URL : https://stackoverflow.com/questions/11201022/how-to-correctly-dismiss-a-dialogfragment
'programing tip' 카테고리의 다른 글
data.frame 열 이름을 함수에 전달 (0) | 2020.08.12 |
---|---|
PHP-문자열 문자 반복 (0) | 2020.08.11 |
GoogleTest에서 특정 테스트 케이스를 실행하는 방법 (0) | 2020.08.11 |
Lisp에서 '(또는 따옴표)를 언제 사용합니까? (0) | 2020.08.11 |
풀하기 전에 로컬과 github의 차이점을 확인하는 방법 (0) | 2020.08.11 |