DialogFragment中的onCreateView和onCreateDialog的差异

时间:2014-12-18 10:14:34

标签: android android-dialogfragment

我有一个工作的DialogFragment,它使用内部类在一些对象上做一堆事情,设置菜单图标等。当我去Android Studio时,我意识到这是不正确的,我一直试图改变内心类是静态的。

这样做,我现在尝试使用onCreateDialog,按照Google docs,“doPositiveClick”和“doNegativeClick”,以便调用MainActivity可以对这些对象执行工作而不是执行它的片段

现在令我困惑的是,如何在片段中设置布局 - 我可以输入标题,信息和按钮:

return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.alert_title)
                .setMessage(R.string.alert_message)

                .setPositiveButton(R.string.set,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                ((MainActivity)getActivity()).doPositiveClick();
                            }
                        }
                )
                .setNegativeButton(R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                ((MainActivity)getActivity()).doNegativeClick();
                            }
                        }
                )

但之前我正在进行如下布局:

        final EditText input = new EditText(MainActivity.this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(20, 20);
        input.setText("5");
        input.setLayoutParams(lp);
        input.setRawInputType(Configuration.KEYBOARD_QWERTY);

问题是,这在onCreateDialog中的位置是什么? Google文档显示了如何在对话框textView上设置文本,但这是在onCreateView()中。

我的困惑是google doc不同时做这两件事,即它没有显示如何同时设置自定义元素,并在调用MainActivity中设置正/负点击 - 或者如果确实如此,我很抱歉我现在无法看到它。

所以有人可以让我更清楚,使用上面的onCreateDialog,我怎么能有一个editText字段,默认值接受用户输入,然后将该输入返回到doPositiveClick()进行处理。

2 个答案:

答案 0 :(得分:1)

DialogFragment可以使用两种方式:对话框或视图。

case1:使用DialogFragment作为对话框。你必须实现onCreateDialog()才能返回一个对话框。然后必须以下列方式显示对话框。看到例子:

public static class MyAlertDialogFragment extends DialogFragment {

public static MyAlertDialogFragment newInstance(int title) {
    MyAlertDialogFragment frag = new MyAlertDialogFragment();
    Bundle args = new Bundle();
    args.putInt("title", title);
    frag.setArguments(args);
    return frag;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    int title = getArguments().getInt("title");

    return new AlertDialog.Builder(getActivity())
            .setIcon(R.drawable.alert_dialog_icon)
            .setTitle(title)
            .setPositiveButton(R.string.alert_dialog_ok,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((FragmentAlertDialog)getActivity()).doPositiveClick();
                    }
                }
            )
            .setNegativeButton(R.string.alert_dialog_cancel,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((FragmentAlertDialog)getActivity()).doNegativeClick();
                    }
                }
            )
            .create();
}

}

创建并必须按以下方式显示对话框。不管是onCreateView()是否实施,都要表现出这种方式。

    // Create the fragment and show it as a dialog.
DialogFragment newFragment = MyDialogFragment.newInstance();
newFragment.show(getFragmentManager(), "dialog");

case2:用作视图(它不是对话框的功能)。这只是观点。你必须实现onCreateView()并按以下方式显示对话框:

public static class MyDialogFragment extends DialogFragment {
static MyDialogFragment newInstance() {
    return new MyDialogFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("This is an instance of MyDialogFragment");
    return v;
}

}

并且必须显示如下视图。与使用Fragment类相同。不管是onCreateDialog()是否实施,都要表现出这种方式。

FragmentTransaction ft = getFragmentManager().beginTransaction();
DialogFragment newFragment = MyDialogFragment.newInstance();
ft.add(R.id.embedded, newFragment);
ft.commit();

<强>摘要: 在设计中,您可以一起实现onCreateView()onCreateDialog(),并在此DialogFragment生命周期中使用相同的源代码。如果屏幕较小,请使用DialogFragment作为对话框。如果屏幕很大,请使用DialogFragment作为视图(相同的常见Fragment类)。

请注意,使用正确的方式显示DialogFragment适合onCreateView()onCreateDialog()以防止例外。

答案 1 :(得分:0)

抱歉,我认为我的搜索工作已经筋疲力尽了,但是在我发布之后我才能修复它,将文本字段/布局放在构建器之前的onCreateDialog中,然后对该输入执行setView():

        **LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(20, 20);
        final EditText input = new EditText(getActivity());
        input.setText("5");
        input.setLayoutParams(lp);
        input.setRawInputType(Configuration.KEYBOARD_QWERTY);**

        // Use the Builder class for convenient dialog construction
        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.alert_title)
                .setMessage(R.string.alert_message)
                **.setView(input)**
                .setPositiveButton(R.string.set,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                ((MainActivity)getActivity()).doPositiveClick();
                            }
                        }
                )

现在唯一的问题是如何在用户输入后获取值?