DialogFragmentは行かない
2997 ワード
Android公式推奨:DialogFragment作成ダイアログ
DialogFragmentには2つの実装方式があり、私はonCreateDialogメソッドを実装していますが、使用中にonViewCreatedメソッドがコールバックされていないことがわかりました(このメソッドではサブスレッドを開いて表示するデータを取得します).
方法の説明によると、onViewCreatedはonCreateViewが実行された後に呼び出されるべきであることがわかりますが、実際には、onCreateViewが返すviewがnullではないという前提があります.ここの論理はFragmentManagerで見つけることができます.
performCreateViewメソッドはonCreateViewのみを呼び出します.ここで返されるviewはonCreateViewが返すviewで、nullでない場合にのみf.onViewCreated(f.mView,f.mSavedFragmentState)を実行し続けることがわかります.onCreateViewメソッドのデフォルトはnullを返します.
これも私のDialogFragmentのonView Createdが実行しない理由です.このようなことは、onCreateViewを書き換えてDialogを作成する方法では起こりません.
では、onCreateDialogでもonView Createdメソッドを実行できる方法はありますか?もちろんあります!自己呼び出しです.
もう1つの方法は、onCreateDialogとonCreateViewを同時に複写することで、onCreateViewが返すviewがnullではなく、onViewCreatedメソッドもトリガーされます.そして同時に実現したのはonCreateDialogが返したdialogである.
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) {
}
方法の説明によると、onViewCreatedはonCreateViewが実行された後に呼び出されるべきであることがわかりますが、実際には、onCreateViewが返すviewが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のみを呼び出します.ここで返されるviewはonCreateViewが返すviewで、nullでない場合にのみf.onViewCreated(f.mView,f.mSavedFragmentState)を実行し続けることがわかります.onCreateViewメソッドのデフォルトはnullを返します.
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return null;
}
これも私のDialogFragmentのonView Createdが実行しない理由です.このようなことは、onCreateViewを書き換えてDialogを作成する方法では起こりません.
では、onCreateDialogでもonView Createdメソッドを実行できる方法はありますか?もちろんあります!自己呼び出しです.
@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;
}
もう1つの方法は、onCreateDialogとonCreateViewを同時に複写することで、onCreateViewが返すviewがnullではなく、onViewCreatedメソッドもトリガーされます.そして同時に実現したのはonCreateDialogが返したdialogである.