DialogFragmentは行かない

2997 ワード

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) {
    }

方法の説明によると、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である.