谷歌建议我们使用DialogFragment而不是使用Fragments API创建一个简单的对话框,但是使用一个孤立的DialogFragment来创建一个简单的Yes-No确认消息框是荒谬的。在这种情况下,最佳实践是什么?


当前回答

你可以创建一般的DialogFragment子类,如YesNoDialog和OkDialog,并传入标题和消息,如果你在应用程序中使用对话框很多。

public class YesNoDialog extends DialogFragment
{
    public static final String ARG_TITLE = "YesNoDialog.Title";
    public static final String ARG_MESSAGE = "YesNoDialog.Message";

    public YesNoDialog()
    {

    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Bundle args = getArguments();
        String title = args.getString(ARG_TITLE);
        String message = args.getString(ARG_MESSAGE);

        return new AlertDialog.Builder(getActivity())
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
                }
            })
            .create();
    }
}

然后使用以下命令调用它:

    DialogFragment dialog = new YesNoDialog();
    Bundle args = new Bundle();
    args.putString(YesNoDialog.ARG_TITLE, title);
    args.putString(YesNoDialog.ARG_MESSAGE, message);
    dialog.setArguments(args);
    dialog.setTargetFragment(this, YES_NO_CALL);
    dialog.show(getFragmentManager(), "tag");

并在onActivityResult中处理结果。

其他回答

我建议使用DialogFragment。

当然,用它创建一个“Yes/No”对话框是相当复杂的,因为它应该是相当简单的任务,但用dialog创建一个类似的对话框也是令人惊讶地复杂。

(活动的生命周期使它变得复杂-你必须让Activity管理对话框的生命周期-没有办法传递自定义参数,例如自定义消息给Activity。如果使用API级别低于8)

这样做的好处是,你通常可以很容易地在DialogFragment之上构建自己的抽象。

DialogFragment基本上是一个可以用作对话框的片段。

使用DialogFragment而不是Dialog的原因如下: 在配置更改和保存&恢复流程后,自动重新创建DialogFragment DialogFragment继承了完整的Fragment生命周期 不再有illegalstateexception和泄漏的窗口崩溃。当活动被警报对话框破坏时,这是非常常见的 还在那里。

更详细地

是的,使用DialogFragment和onCreateDialog,你可以简单地使用AlertDialog构建器创建一个简单的AlertDialog与Yes/No确认按钮。根本没有多少代码。

关于处理事件在你的片段会有各种方法,但我只是在我的片段定义了一个消息处理程序,通过它的构造函数传递到DialogFragment,然后将消息传递回我的片段的处理程序适当的各种点击事件。有很多方法,但下面的方法对我来说是有效的。

在对话框中保存一个消息并在构造函数中实例化它:

private Message okMessage;
...
okMessage = handler.obtainMessage(MY_MSG_WHAT, MY_MSG_OK);

在你的对话框中实现onClickListener,然后适当地调用处理程序:

public void onClick(.....
    if (which == DialogInterface.BUTTON_POSITIVE) {
        final Message toSend = Message.obtain(okMessage);
        toSend.sendToTarget();
    }
 }

Edit

由于Message是可打包的,你可以在onSaveInstanceState中保存它并恢复它

outState.putParcelable("okMessage", okMessage);

然后在onCreate中

if (savedInstanceState != null) {
    okMessage = savedInstanceState.getParcelable("okMessage");
}

在AlertDialog上使用DialogFragment:


Since the introduction of API level 13: the showDialog method from Activity is deprecated. Invoking a dialog elsewhere in code is not advisable since you will have to manage the the dialog yourself (e.g. orientation change). Difference DialogFragment - AlertDialog Are they so much different? From Android reference regarding DialogFragment: A DialogFragment is a fragment that displays a dialog window, floating on top of its activity's window. This fragment contains a Dialog object, which it displays as appropriate based on the fragment's state. Control of the dialog (deciding when to show, hide, dismiss it) should be done through the API here, not with direct calls on the dialog. Other notes Fragments are a natural evolution in the Android framework due to the diversity of devices with different screen sizes. DialogFragments and Fragments are made available in the support library which makes the class usable in all current used versions of Android.

DialogFragment具有对话框和片段的功能。基本上所有的生命周期事件都是由DialogFragment自动管理的,比如屏幕配置的改变等。