【问题标题】:How to make a DatePicker with DialogFragment and FragmentManager?如何使用 DialogFragment 和 FragmentManager 制作 DatePicker?
【发布时间】:2012-06-13 04:18:35
【问题描述】:

所以我已经有一段时间了,我似乎无法弄清楚。我是 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。但这就是我迷路的地方。

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

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

【问题讨论】:

    标签: android android-fragments android-dialogfragment android-datepicker


    【解决方案1】:

    按您的帖子顺序... \

    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
        }
    }
    

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

    【讨论】:

    • 真的很想感谢你花的时间!我不明白的一件事,getSupportFragmentManager() 是如何获得 FragmentManager 的?是在他的代码里吗?我应该已经注意到了。我觉得不傻。
    • IS 片段管理器(使用支持库时)。如果您不使用支持库,它将是getFragmentManager。无论您使用哪个版本,都会调用框架为您提供片段管理器。
    • 从头开始!我找到了。活动课。我没想到。
    • 我不想打扰你,但我一直在尝试理解代码,但由于我从未使用过片段,所以我真的不知道它们如何组合在一起使用日期选择器对话框。既然您已经查看了代码,您能否帮我弄清楚哪些类实际上直接与 DatePicker 一起使用,以便我可以专注于它。我只是不知道实际与什么交互。再次抱歉,如果我打扰你了。
    【解决方案2】:

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

    https://github.com/Zeroe31890/DateDialogFragment

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

    【讨论】:

    • 感谢您的帮助:)
    • 与我发现的任何其他示例相比,这更接近于跨屏幕旋转工作(大多数崩溃,而不是仅仅未能使用该值更新调用活动)。以灵活性为代价,我能够通过传递按钮的 id 而不是回调并在 onDateSet() 中使用 getActivity.findViewById() 来获取按钮,以便我可以调用 setText()
    【解决方案3】:

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

    【讨论】:

    • 所以我终于有机会看一看了。我明白我为什么感到困惑了。而且我肯定会变得更好,但我从未使用过片段,而 DatePicker 如何与它结合在一起现在让我更加困惑,哈哈。我会继续深入并剖析它,以便在我需要学习它时更了解它,但如果你有机会给我发电子邮件,我在你的博客上提供并更彻底地帮助我,那将是惊人的。如果不是,我完全理解,我很感激这篇文章的开头有很大帮助。祝你有美好的一天。
    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多