DialogFragment.getDialog возвращает null
Я пытаюсь получить Диалог, который я создал с расширенным диалоговым окном DialogFragment, используя DialogFragment.getDialog(), но он возвращает null.
В основном я хочу изменить текст в макете из FragmentActivity, который создает и показывает диалоговое окно.
Ответы
Ответ 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