development

DialogFragment.getDialog가 null을 반환합니다.

big-blog 2021. 1. 5. 21:04
반응형

DialogFragment.getDialog가 null을 반환합니다.


DialogFragment.getDialog ()를 사용하여 확장 된 DialogFragment로 만든 대화 상자를 가져 오려고하지만 null을 반환합니다.

기본적으로 DialogFragment를 만들고 표시하는 FragmentActivity에서 레이아웃의 텍스트를 변경하고 싶습니다.


getDialog()DialogFragmen'ts 라이프 사이클에서 너무 일찍 전화하고 있습니다.

getDialog()mDialogDialogFragment에서 전용 변수 반환합니다 .

DialogFragment가 인스턴스화 될 때 mDialognull의 경우, 때 그것은 세트를 가져옵니다 onCreateDialog내부 해고 getLayoutInflater(Bundle savedInstanceState)당신이 전화를해야하므로, getDialogonCreateDialog.

예를 들어,라는 몇 가지 일반적인 방법의 순서는 onCreate, onCreateDialogonCreateView, onStart. 그래서, 당신은 호출 할 수 있습니다 getDialog그것은 뭔가를 반환 한 onCreateViewonStart에 있지만 onCreateonCreateDialog.

Eventhough onStart가 호출 called when the Fragment is visible to the user되고 해당 지점에서 조각의 레이아웃을 조정하면 괜찮아 보입니다. 예를 들어 너비와 높이를 사용하여 설정 getDialog().getWindow().setLayout(..., ...);하면 조각이 크기가 변경되는 것처럼 보이지 않지만 새로 설정된 크기가있는 것처럼 보입니다.


사용 가능한 FragmentManager에서 executePendingTransactions ()를 호출 해보십시오.

    dialogFragment = new DialogFragment();
        ...
    dialogFragment.show(mFragmentActivity.getSupportFragmentManager(), "Dialog");
    mFragmentActivity.getSupportFragmentManager().executePendingTransactions();

    Dialog d = dialogFragment.getDialog()
        ...

DialogFragment를 표시하는 두 가지 방법이 있습니다.

  void showDialog() { 
    // Create the fragment and show it as a dialog. 
    DialogFragment newFragment = MyDialogFragment.newInstance(); 
    newFragment.show(getFragmentManager(), "dialog");
} 

 FragmentTransaction ft = getFragmentManager().beginTransaction();
DialogFragment newFragment = MyDialogFragment.newInstance(); 
ft.add(R.id.embedded, newFragment);
ft.commit(); 

첫 번째 방법을 사용할 때만 Null이 아닌 대화 상자를 가져올 수 있습니다.


public class Dialog extends DialogFragment {

private DialogListener dialogListener;


public void setDialogListener(DialogListener dialogListener) {
    this.dialogListener = dialogListener;
}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.layout_dialog, null);
    return view;
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    if (null != dialogListener) {
        dialogListener.onDismiss();
    }
}

public interface DialogListener {
    void onDismiss();
}

}

활동 중 ...

  Dialog  dialog= new Dialog();
        dialog.setDialogListener(new Dialog.DialogListener() {
            @Override
            public void onDismiss() {
                Foo()..
            }
        });

One reason for why getDialog() might return null after the dialog has been constructed and properly stored in mDialog is an accidental invocation of dismiss() on the DialogFragment.

When dismiss() is called, it will reset the mDialog field to null so that subsequent invocations of getDialog() will return null instead of the previously constructed dialog.

In my case, dismiss() was called to handle an error situation / side-case in the DialogFragment's onActivityCreated() method. Subsequently trying to use getDialog() from the onResume() method returned null.

Also refer to the source code of the DialogFragment class, specifically its dismissInternal(boolean allowStateLoss) method:

https://github.com/aosp-mirror/platform_frameworks_base/blob/pie-platform-release/core/java/android/app/DialogFragment.java

ReferenceURL : https://stackoverflow.com/questions/8456143/dialogfragment-getdialog-returns-null

반응형