如何正确使用DialogFragment?

时间:2015-12-08 13:09:29

标签: android android-fragments android-activity

我想在对话框内以及活动中使用片段。因此,该片段来自DialogFragment。 现在的问题是,只要片段覆盖onCreateView()onCreateDialog()方法,将片段显示为对话框就会与android.util.AndroidRuntimeException: requestFeature() must be called before adding content崩溃。

如果onCreateView()被删除,则显示为对话框效果不错,但将片段嵌入活动中时,会遇到java.lang.IllegalStateException: Fragment com.blah.SomeFragment did not create a view.

崩溃

删除onCreateDialog()将是一个解决方案,但是对话框按钮应该在哪里接线?

现在,我完全不知道如何在两种情况下使用相同的DialogFragment派生类 - 在对话框内和活动内 - 并不是DialogFragment所有关于DialogFragment的内容?我有点不明白......使用import pandas as pd from pandas import Timestamp times = pd.Series([Timestamp('2015-11-27 00:00:00.540000'), Timestamp('2015-11-27 00:00:00.699000'), Timestamp('2015-11-27 00:00:01'), Timestamp('2015-11-27 00:00:01.699000'), Timestamp('2015-11-27 00:00:02.699000')]) In [116]: times Out[116]: 0 2015-11-27 00:00:00.540 1 2015-11-27 00:00:00.699 2 2015-11-27 00:00:01.000 3 2015-11-27 00:00:01.699 4 2015-11-27 00:00:02.699 Name: GMT, dtype: datetime64[ns] 的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您需要将DialogFragment作为DialogFragment和其他活动中的普通片段,您可以使用setShowsDialog指定您正在使用的内容,如下所示:

@Override
public void onCreate( Bundle savedInstanceState ) {
   super.onCreate( savedInstanceState );
   setShowsDialog( false );
}

然后覆盖onCreateDialogonCreateView,如下所示:

@NonNull
@Override
public Dialog onCreateDialog( Bundle savedInstanceState ) {
   AlertDialog.Builder builder = new Builder( getActivity() );
   // custom view inside the dialog
   builder.setView( createView( getActivity().getLayoutInflater(), null, savedInstanceState ) );
   return builder.create();
}

@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
   if ( getShowsDialog() ) {
      return super.onCreateView( inflater, container, savedInstanceState );
   } else {
      // custom view creation
      return createView( inflater, container, savedInstanceState );
   }
}

在我的代码中,我有一个BaseClassFragment,其中setsShowDialog为false,然后我有一个子类DialogBaseClassFragment,它将setsShowDialog设置为true并在适当时使用它们。