DialogFragment.getDialog返回null

我正在尝试使用DialogFragment.getDialog()来获得使用扩展DialogFragment创build的对话框,但它返回null。

基本上我想改变从创build和显示DialogFragment的FragmentActivity布局中的文本。

您在DialogFragmen的生命周期中太早调用getDialog()

getDialog()只是返回DialogFragment的私有variablesmDialog

当一个DialogFragment实例化时, mDialog为null,然后在getLayoutInflater(Bundle savedInstanceState)内部触发onCreateDialog时设置它,所以你必须在onCreateDialog之后调用getDialog

例如,调用的一些常用方法的顺序是onCreateonCreateDialogonCreateViewonStart 。 所以,你可以调用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() ... 

有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(); 

使用第一种方法时只能得到一个非空对话框。

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