DialogFragmentはonViewCreatedに移動しません



Dialogfragment Does Not Go Onviewcreated



Androidの公式推奨事項:DialogFragmentはダイアログを作成します

DialogFragmentには2つの実装があります。 onCreateDialogメソッドを使用しましたが、処理中にonViewCreatedメソッドがコールバックされなかったことがわかりました(このメソッドで子スレッドを開いてデータを表示しました)。



/** * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} * has returned, but before any saved state has been restored in to the view. * This gives subclasses a chance to initialize themselves once * they know their view hierarchy has been completely created. The fragment's * view hierarchy is not however attached to its parent at this point. * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. * @param savedInstanceState If non-null, this fragment is being re-constructed * from a previous saved state as given here. */ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { }

メソッドの導入によると、onCreateViewの実行後にonViewCreatedを呼び出す必要があることがわかっていますが、実際にはここに前提があります。つまり、onCreateViewによって返されるビューはnullではなく、ここのロジックは次の場所にあります。 FragmentManager:

f.mView = f.performCreateView(f.performGetLayoutInflater( f.mSavedFragmentState), container, f.mSavedFragmentState) if (f.mView != null) { f.mInnerView = f.mView f.mView.setSaveFromParentEnabled(false) if (container != null) { container.addView(f.mView) } if (f.mHidden) { f.mView.setVisibility(View.GONE) } f.onViewCreated(f.mView, f.mSavedFragmentState) dispatchOnFragmentViewCreated(f, f.mView, f.mSavedFragmentState, false) // Only animate the view if it is visible. This is done after // dispatchOnFragmentViewCreated in case visibility is changed f.mIsNewlyAdded = (f.mView.getVisibility() == View.VISIBLE) && f.mContainer != null }

performCreateViewメソッドはonCreateViewのみを呼び出します。ここで返されるビューは、onCreateViewによって返されるビューです。 f.onViewCreated(f.mView、f.mSavedFragmentState)は、nullでない場合にのみ実行され続けることがわかります。onCreateViewメソッドはデフォルトでnullを返します。



public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return null }

これが、DialogFragmentのonViewCreatedが実行されない理由でもあります。これは、onCreateViewをオーバーライドしてダイアログを作成する場合には当てはまりません。

onCreateDialogでonViewCreatedメソッドを実行する方法はありますか?もちろん!それを自分で呼ぶことです:

@Override public Dialog onCreateDialog(Bundle savedInstanceState) { Timber.i('onCreateDialog') AlertDialog dialog = new AlertDialog.Builder(getContext()) .setMessage('this is a dialog form onCreateDialog') .create() onViewCreated(dialog.findViewById(R.id.fl_root), savedInstanceState) return dialog }

onCreateDialogとonCreateViewを同時に上書きして、onCreateViewによって返されるビューがnullにならないようにする方法もあります。これにより、onViewCreatedメソッドもトリガーされます。同時に、実装はonCreateDialogによって返されるダイアログを表示します。