Android DialogFragment onViewCreated没有调用

我正在使用Android兼容性库(V4修订版8)。 在自定义的DialogFragment中,被覆盖的方法onViewCreated没有被调用。

public class MyDialogFragment extends DialogFragment{ private String mMessage; public MyDialogFragment(String message) { mMessage = message; } @Override public Dialog onCreateDialog( Bundle savedInstanceState){ super.onCreateDialog(savedInstanceState); Log.d("TAG", "onCreateDialog"); setRetainInstance(true); //....do something } @Override public void onViewCreated(View view, Bundle savedInstanceState) { Log.d("TAG", "onViewCreated"); //...do something } } 

onViewCreated没有被logging。

Solutions Collecting From Web of "Android DialogFragment onViewCreated没有调用"

那么,onViewCreated状态的文档“立即调用onCreateView(LayoutInflater,ViewGroup,Bundle)后返回”。

DialogFragment使用onCreateDialog而不是onCreateView,所以onViewCreated不会被触发。 (会是我的工作理论,我没有潜入Android源确认)。

从我的testing中,如果onCreateView返回null(这是默认行为),则不会调用onViewCreated ,因此如果您不使用onCreateView,而是手动调用onCreateDialog setContentView ,则可以手动从onCreateDialog调用onViewCreated

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog d = super.onCreateDialog(savedInstanceState); d.setContentView(R.layout.my_dialog); // ... do stuff.... onViewCreated(d.findViewById(R.id.dialog_content), savedInstanceState); return d; } 

在这种情况下,请确保my_dialog.xml的根元素具有android:id="@+id/dialog_content"

根据文档( 在对话框或embedded之间select )并自己testing,可以覆盖OnCreateView,使用您的自定义布局进行膨胀并返回。 OnViewCreated将会启动

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.custom_layout, null); //do whatever return view; } 

您可以从源代码中看到发生了什么事情:

首先,因为你不覆盖onCreateView()你的片段的视图将是空的。 这可以从Fragment的源代码中看出 – 默认返回null

 // android.support.v4.app.Fragment.java @Nullable public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return null; } 

其次,由于你的视图是null, FragmentManager将不会调用onViewCreated() 。 从FragmentManager的源代码 :

 // android.support.v4.app.FragmentManager.java if (f.mView != null) { f.mInnerView = f.mView; // ... // only called if the fragments view is not null! f.onViewCreated(f.mView, f.mSavedFragmentState); } else { f.mInnerView = null; }