Подтвердить что ты не робот

DialogFragment.getDialog возвращает null

Я пытаюсь получить Диалог, который я создал с расширенным диалоговым окном DialogFragment, используя DialogFragment.getDialog(), но он возвращает null.

В основном я хочу изменить текст в макете из FragmentActivity, который создает и показывает диалоговое окно.

4b9b3361

Ответ 1

Вы вызываете getDialog() слишком рано в жизненном цикле DialogFragmen'ts.

getDialog() просто возвращает закрытую переменную mDialog из диалогового окна "Диалог".

При создании экземпляра DialogFragment mDialog имеет значение null, а затем он устанавливается, когда onCreateDialog запускается внутри getLayoutInflater(Bundle savedInstanceState), поэтому вам нужно позвонить getDialog после onCreateDialog.

Например, порядок некоторых распространенных методов называется onCreate, onCreateDialog и onCreateView, onStart. Таким образом, вы можете вызвать getDialog и вернуть его в onCreateView или onStart, но не в onCreate или onCreateDialog.

Eventough onStart называется called when the Fragment is visible to the user, настройка макета фрагмента в этой точке выглядит отлично... например, установка ширины и высоты с помощью getDialog().getWindow().setLayout(..., ...); не приводит к изменению размера фрагмента, но просто появляется новый заданный размер.

Ответ 2

Попробуйте вызвать executePendingTransactions() из доступного FragmentManager.

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

    Dialog d = dialogFragment.getDialog()
        ...

Ответ 3

Существует 2 способа отображения 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(); 

При первом использовании вы можете получить диалог nonNull.

Ответ 4

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()..
            }
        });

Ответ 5

Одной из причин того, почему getDialog() может возвращать значение null после того, как диалог был создан и правильно сохранен в mDialog является случайный вызов DialogFragment dismiss() в DialogFragment.

Когда mDialog dismiss(), он сбрасывает поле mDialog в null чтобы последующие вызовы getDialog() возвращали null вместо ранее созданного диалога.

В моем случае dismiss() был вызван для обработки ситуации ошибки/побочного случая в DialogFragment onActivityCreated(). Впоследствии попытка использовать getDialog() из onResume() вернула значение null.

Также обратитесь к исходному коду класса DialogFragment, в частности к его dismissInternal(boolean allowStateLoss):

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