Android - OnDateChangedListener - 你如何设置这个?

Posted

技术标签:

【中文标题】Android - OnDateChangedListener - 你如何设置这个?【英文标题】:Android - OnDateChangedListener - how do you set this? 【发布时间】:2011-01-04 07:14:48 【问题描述】:

android 中有一个名为 DatePicker.OnDateChangedListener 的事件监听器。 我正在尝试将 DatePicker 视图的日期更改监听器设置如下:

DatePicker dp = new DatePicker(getContext());
dp.setOnDateChangedListener(this); 
//where this is my activity extends DatePicker.OnDateChangedListener

但是你猜怎么着? 日期选择器没有名为 setOnDateChangedListener 的方法。

我的问题是:

    那么如何在 Android 中设置日期更改侦听器? 如果无法设置日期更改侦听器,此事件的目的是什么?

任何文档/教程都会很有帮助。

【问题讨论】:

【参考方案1】:

创建DatePicker 后,首先需要使用要显示的日期对其进行初始化。这就是您可以添加侦听器的位置。

DatePicker.init(int, int, int, OnDateChangedListener)

更新

26 API 允许设置监听器:DatePicker.setOnDateChangedListener()

【讨论】:

Android API 真的很重要。我不知道是谁想出了这种荒谬的方法 这对我来说似乎并不荒谬,至少它在 API 文档中。无论如何,我想原因是因为 Android 小部件通常有多个构造函数,因为当您希望控制应该使用什么样式和布局属性创建它时——所以它们保持了该约定,而不是创建具有许多参数的大量构造函数。 使用 setOnDateChangedListener() 方法来设置点击监听器似乎很合适。我想知道为什么他们让您将其初始化为自动为您初始化为今天的日期? @ChristopherOrr 这里可怕的部分主要是有一个TimePicker和一个DatePicker,它们有完全不同的接口。 (哇,老帖子……纳米) 哇,我刚刚花了 2 个小时来了解如何为 DatePicker 设置一个简单的侦听器,直到我发现它不起作用。注意:只有从 API 级别 26 起,您才能直接使用 setOnDateChangedListener()。如果你低于你必须使用一种解决方法-.-【参考方案2】:

最好的办法是

        DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() 

                @Override
                public void onDateChanged(DatePicker datePicker, int year, int month, int dayOfMonth) 
                    Log.d("Date", "Year=" + year + " Month=" + (month + 1) + " day=" + dayOfMonth);

                
            );

【讨论】:

【参考方案3】:

这个视图实际上是四个视图的组合,它们是:

三个旋转器

一个日历视图

从OnDateChangeListener开始,你传入init方法的对象会简单的传给包含的CalendarView,相信你也知道在好老的CalendarView中有一个setOnDateChangeListener方法……。 .....

在 DatePicker 类中,有一个名为 getCalendarView 的方法,如果您想获得包含的 CalendarView,可以调用该方法。

一旦你掌握了包含的 CalendarView,那么,不用说,你可以调用它的 setOnDateChangeListener

【讨论】:

对于糟糕的 API,这是一个很好的解决方法。谢谢你 - 你刚刚救了我的培根! datePicker.getCalendarView().setOnDateChangeListener() 完全有效!谢谢!虽然不是很直观。还是觉得API应该是datePicker.setOnDateChangeListner()。【参考方案4】:

类似这样的:

DatePicker myDatePicker = (DatePicker) findViewById(R.id.my_date_picker);
myDatePicker.getCalendarView().setOnDateChangeListener(new CalendarView.OnDateChangeListener() 
    @Override
    public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) 
        Log.d("tag", "finally found the listener, the date is: year " + year + ", month "  + month + ", dayOfMonth " + dayOfMonth);
    
);

【讨论】:

它给出了 UnsupportedOperationException: DatePicker 的 CalendarView 不存在 使用 android:datePickerMode="spinner" 为 DatePicker 充气,并且该 Listener 为我工作。没有任何合乎逻辑的解释......【参考方案5】:

致电init() on the DatePicker object。

【讨论】:

以上是关于Android - OnDateChangedListener - 你如何设置这个?的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录