在片段中创建android对话框而不是由活动直接创建的原因是什么?

时间:2014-03-12 19:12:55

标签: java android android-fragments android-dialogfragment

我正在学习在Android中开发应用程序,我对这些文档感到有些困惑。我有一个带有按钮的活动,该按钮最初填充了我从日历类中获得的日期。当用户点击此按钮时,会显示 DatePicker 对话框并允许我设置新日期,然后应将该日期写回该按钮的文本并用于进一步处理

我看到Android Pickers documentation建议您创建一个 DatePickerFragment ,扩展 DialogFragment ,如下所示:

public static class DatePickerFragment extends DialogFragment
                            implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
}

我知道对话框中设置的日期将可以从 onDateSet 方法获得,该方法是 DatePickerDialog.OnDateSetListener 接口的实现,但是我没有做到请问为什么不直接从主要活动中调用 DatePickerDialog ? (就我而言,这正是我最终做的事情,并且工作正常......)。

从我的新手角度来看,实现 DatePickerFragment 似乎就像活动 DatePickerDialog 之间显然不必要的中间层一样,在将 DatePickerFragment.onDateSet 上设置的日期传递给主要活动的意义上,要使接口也由主要活动实现并将初始日期传达给片段我必须通过 Bundle 对象来完成,如here所示。

这只是文档的问题,试图成为通才,从片段而不是活动开始(我感觉片段有点像轻量级活动)或者确实存在一些优势或事物我是'我失踪了,所以我不直接从活动中调用对话框?

1 个答案:

答案 0 :(得分:2)

由于您是Android的新手并且尚未遇到它,让我打破它:在Android中处理方向更改是一件痛苦的事。简而言之:每次更改方向时都会重新创建活动。所有像Dialogs这样的数据成员都变为空。

为了解决这个问题,有两种方法可以处理方向更改并拥有一个"保留片段"是其中之一。因此,DialogFragment是这个"保留片段"的一种风格。 (不要引用我的话),这不会因方向改变而被破坏。

有关此内容的更多信息:http://developer.android.com/guide/topics/resources/runtime-changes.html