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
。
例如,调用的一些常用方法的顺序是onCreate
, onCreateDialog
和onCreateView
, onStart
。 所以,你可以调用getDialog
,并让它返回onCreateView
或onStart
,但不是在onCreate
或onCreateDialog
。
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().. } });