DialogFragment OnCreateView 与 OnCreateDialog 的自定义布局重要

我正在尝试使用自己的布局创建一个DialogFragment。

我见过几种不同的方法。有时布局是在OnCreateDialog中设置的,如下所示:(我使用的是Mono,但我已经习惯了Java)

public override Android.App.Dialog OnCreateDialog (Bundle savedInstanceState)
{
    base.OnCreateDialog(savedInstanceState);
    AlertDialog.Builder b = new AlertDialog.Builder(Activity);
        //blah blah blah
    LayoutInflater i = Activity.LayoutInflater;
    b.SetView(i.Inflate(Resource.Layout.frag_SelectCase, null));
    return b.Create();
}

第一种方法对我有用...直到我想使用,所以经过一些谷歌搜索后,我尝试了第二种方法,其中包括覆盖findViewByID.OnCreateView

因此,我注释掉了设置布局的两行,然后添加了以下内容:OnCreateDialog

public override Android.Views.View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View v = inflater.Inflate(Resource.Layout.frag_SelectCase, container, false);
        //should be able to use FindViewByID here...
    return v;
}

这给了我一个可爱的错误:

11-05 22:00:05.381: E/AndroidRuntime(342): FATAL EXCEPTION: main
11-05 22:00:05.381: E/AndroidRuntime(342): android.util.AndroidRuntimeException: requestFeature() must be called before adding content

我很困惑。


答案 1

我有同样的异常与下面的代码:

public class SelectWeekDayFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
        .setMessage("Are you sure?").setPositiveButton("Ok", null)
        .setNegativeButton("No way", null).create();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.week_day_dialog, container, false);

        return view;    
    }
}

您必须选择覆盖 DialogFragment 中的 onCreateView 或 onCreateDialog 之一。覆盖两者将导致异常:“在添加内容之前必须调用 requestFeature()”。

重要

有关完整答案,请查看@TravisChristian注释。正如他所说,您确实可以覆盖两者,但是当您在已经创建了对话框视图后尝试放大视图时,问题就来了。


答案 2

第一种方法对我有用...直到我想使用FindViewByID。

我猜你没有限定返回的视图的范围,试试这个:findViewById()inflate()

View view = i.inflate(Resource.Layout.frag_SelectCase, null);
// Now use view.findViewById() to do what you want
b.setView(view);

return b.create();

推荐