DialogFragment.getDialog返回null

tec*_*ces 56 android

我试图使用DialogFragment.getDialog()获取我使用扩展DialogFragment创建的Dialog,但它返回null.

基本上我想从FragmentActivity改变布局中的文本,FragmentActivity创建并显示DialogFragment.

Pet*_*tai 76

getDialog()在DialogFragmen'ts生命周期中过早地打电话.

getDialog()只需mDialog从DialogFragment 返回私有变量.

实例化DialogFragment时为mDialognull,然后在onCreateDialog内部触发时设置它getLayoutInflater(Bundle savedInstanceState),因此您必须在getDialog之后调用onCreateDialog.

例如,一些所谓的常用方法的顺序是onCreate,onCreateDialogonCreateView,onStart.所以,你可以打电话给getDialog它,让它返回onCreateView或者onStart,onCreate或者不是或onCreateDialog.

虽然onStart调用了eventhough called when the Fragment is visible to the user,但在那一点上调整片段的布局看起来很好......例如,设置宽度和高度使用getDialog().getWindow().setLayout(..., ...);不会使片段看起来改变大小,但只是看起来有新设置的大小.

  • 即使在onCreateView,onStart和onResume中,getDialog()也会为我返回null ...任何建议? (13认同)
  • onStart为我工作,onCreateView没有 (4认同)

Gon*_*alo 57

尝试从可用的FragmentManager调用executePendingTransactions().

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

    Dialog d = dialogFragment.getDialog()
        ...
Run Code Online (Sandbox Code Playgroud)

  • 这是由于事务更改的延迟执行.我们可以通过调用FragmentManager类的executePendingTransactions()方法来强制立即执行FragmentTransaction实例的工作.当对executePendingExecutions()方法的调用返回时,我们知道已经执行了所有已提交的FragmentTransaction工作. (3认同)
  • executePendingTransactions()解决了我的问题. (2认同)
  • 有用!但这是一个晦涩的调用 - 我原以为.show会触发所有未决的片段 (2认同)

Hai*_*anh 7

有两种显示DialogFragment的方法:

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

 FragmentTransaction ft = getFragmentManager().beginTransaction();
DialogFragment newFragment = MyDialogFragment.newInstance(); 
ft.add(R.id.embedded, newFragment);
ft.commit(); 
Run Code Online (Sandbox Code Playgroud)

使用第一种方法时,只能获得一个nonNull对话框.