4

所以我已经有一段时间了,我似乎无法弄清楚。我是 Android 开发的新手,所以请多多包涵。我对创建 Datepicker 不太熟悉,我学会了以不推荐的方式来完成它,只是为了掌握它的窍门。使用本教程让我加快速度:

http://developer.android.com/resources/tutorials/views/hello-datepicker.html

但是现在我需要更改它,主要是不使用已弃用的代码,所以我环顾四周,找到了 2 个教程,但主要是这个:

http://www.kylebeal.com/2011/11/android-datepickerdialog-and-the-dialogfragment/

问题是,有些代码没有意义。主要是这部分:

//create new DateDialogFragment
DateDialogFragment ddf = DateDialogFragment.newInstance(this, R.string.set_date, date);

ddf.setDateDialogFragmentListener(new DateDialogFragmentListener() {

    @Override
    public void dateDialogFragmentDateSet(Calendar date) {
        // update the fragment
        mDateDetailFragment.updateDate(date);
    }
});

ddf.show(getSupportFragmentManager(), "date picker dialog fragment");

假设是在它运行的活动类中运行的内容。所以我有点了解其余代码中发生的情况,并随意查看其余部分,因为它可能会有所帮助。该代码基本上遵循与原始代码几乎相同的路线showDialog()。实现DatePickerDialog.onDateSetListener并返回一个新DatePickerDialog的,明显的例外是它使用 DialogFragment。但这就是我迷路的地方。

部分原因是因为我不确定新的 DatePickerDialog在哪里 onCreateDialog()返回。如果你看我说的代码没有意义,两者mDateDetailFragmentgetSupportFragmentManager()没有实例化或出现在其他任何地方,所以我无法让教程代码工作。Android Doc 还提到,showDialog()我应该同时使用DialogFragmentand而不是使用FragmentManager,这里也没有这样做。只有 DialogFragment。

所以就像标题一样,我如何才能以非弃用形式制作 DatPicker?我会要求不要将我发送到链接,只是说看看这里。我已经做到了。相信我。如果不是,至少解释一下我错过了什么才有意义。此外,如果有人能真正告诉我该onCreateDialog()方法将 发送到哪里DatePickerDialog,那也将非常有帮助。我只是想弄明白这一切,而不是复制和粘贴代码(无论如何它都不起作用)。非常感谢您抽出时间阅读本文,如果需要任何澄清,请询问。

4

3 回答 3

4

按照您的帖子顺序... \

1)onCreateDialog将对话框返回给DialogFragment。

2)我不知道这mDateDetailFragment.updateDate(date);条线......我认为他可能遗漏了一些代码。 编辑 找到它,它在他完整演示的 zip 文件中的一个类中。

3)您正在使用片段管理器(它的getSupportFragmentManager()一部分):

ddf.show(getSupportFragmentManager(), "date picker dialog fragment");

好的,也就是说,这就是我的做法(我使用的是 DateSlider,但在它的位置插入 Datepicker 对你来说应该足够简单)。

在调用 DialogFragment 的片段/活动中:

DialogFragment newFragment = new DateDialog();
newFragment.show(getFragmentManager(), "dialog"); 

还有我的 DialogFragment:

public class DateDialog extends DialogFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    private DateSlider.OnDateSetListener mDateSetListener = new DateSlider.OnDateSetListener() {
        public void onDateSet(DateSlider view, Calendar selectedDate) {
            MemberAddFragment.startTxt.setText(String.format("%tB %te, %tY", selectedDate, selectedDate, selectedDate));
        }
    };

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar c = Calendar.getInstance();  // Get calendar instance to use in DateSlider
        return new AlternativeDateSlider(getActivity(),mDateSetListener,c,null,null);  // return DateSlider dialog to DialogFragment
    }
}

希望这有助于消除您的困惑。

于 2012-06-13T06:58:24.430 回答
3

我知道这个问题是我的,并且已经有了答案。但我想我会将自己的答案添加给其他人,以寻求在同一问题上的帮助。我已将上面提供的示例代码简化为 2 个类。Kbeal 非常亲切地提供了教程,他做得很好,但它过于臃肿,提供了甚至没有必要的信息。因此,使用我对对话框的了解以及从 Kbeal 的教程中学到的知识以及我对片段所做的研究,我从我的 GitHub 上的 DatePickerDialog 提供了我的实现。

https://github.com/Zeroe31890/DateDialogFragment

老实说,您只需在复制和粘贴 2 个类、单一布局和修改 Android Manifest 文件后直接运行它。比任何其他教程都容易得多。哦,如果有人看到任何可以做得更好的事情,请这样做。享受!

于 2012-06-16T06:45:18.293 回答
0

此处帖子的作者:听起来您已经弄清楚了。尽管巴拉克在回答这些问题方面做得很好,但在发现这个问题之前,我已经在我的帖子中回答了你的问题。如果您还没有这样做,请下载示例应用程序的完整源代码。我认为这将有助于填补您仍然存在的任何缺失的空白。

于 2012-06-13T15:45:45.937 回答