android_基础_日期选择器 DatePicker and TimePicker

121 篇文章 1 订阅

转载自: https://www.jianshu.com/p/05dade729e28

Android构建自定义日期时间选择器

Android开发中有时会用到日期和时间的选择,系统自带的有DatePicker和TimePicker两种,但是当我们需要同时选择日期和时间时,自带的选择器就存在比较大的问题。

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp" >

    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:calendarViewShown="false"
        android:datePickerMode="spinner"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TimePicker
        android:id="@+id/time_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:timePickerMode="spinner"
        app:layout_constraintStart_toEndOf="@id/date_picker"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

当我们将两个选择器放在同一行,方便页面进行适配时发现,自带的选择器空间无法调整大小,两个选择器都会采用默认宽高,使得部分内容无法显示。

在这里插入图片描述

因此最好的办法还自定义一个时间日期选择器,同时也能方便以后进行样式修改美化。

系统自带的选择器还有一个NumberPicker,我们可以使用这个控件,结合其他控件做出想要的效果。
部分实现代码如下:
dialog_fragment_date_time_picker.xml

<LinearLayout
    android:id="@+id/item_linear_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginEnd="16dp"
    android:gravity="fill_horizontal">

    <NumberPicker
        android:id="@+id/number_picker_year"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.2"
        android:descendantFocusability="blocksDescendants" />

    <TextView
        android:id="@+id/text_view_year"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.05"
        android:gravity="center"
        android:text="@string/text_year" />

    <NumberPicker
        android:id="@+id/number_picker_month"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.15"
        android:descendantFocusability="blocksDescendants" />

    <TextView
        android:id="@+id/text_view_month"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.05"
        android:gravity="center"
        android:text="@string/text_month" />

    <NumberPicker
        android:id="@+id/number_picker_date"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.15"
        android:descendantFocusability="blocksDescendants" />

    <TextView
        android:id="@+id/text_view_date"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.05"
        android:gravity="center"
        android:text="@string/text_date" />

    <NumberPicker
        android:id="@+id/number_picker_hour"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.15"
        android:descendantFocusability="blocksDescendants" />

    <TextView
        android:id="@+id/text_view_hour"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.05"
        android:gravity="center"
        android:text="@string/text_time_symbol" />

    <NumberPicker
        android:id="@+id/number_picker_minute"
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="0.15"
        android:descendantFocusability="blocksDescendants" />

</LinearLayout>

先在xml文件中自定义控件样式,为每个控件排好位置。再通过代码对每个NumberPicker进行限制。
DateTimePickerDialogFragment.java

Calendar calendar = Calendar.getInstance();
NumberPicker yearPicker = findViewById(R.id.number_picker_year);
NumberPicker monthPicker = findViewById(R.id.number_picker_month);
NumberPicker datePicker = findViewById(R.id.number_picker_date);
NumberPicker hourPicker = findViewById(R.id.number_picker_hour);
NumberPicker minutePicker = findViewById(R.id.number_picker_minute);

//限制年份范围为前后五年
int yearNow = calendar.get(Calendar.YEAR);
yearPicker.setMinValue(yearNow - 5);
yearPicker.setMaxValue(yearNow + 5);
yearPicker.setValue(yearNow);
yearPicker.setWrapSelectorWheel(false);  //关闭选择器循环

//设置月份范围为1~12
monthPicker.setMinValue(1);
monthPicker.setMaxValue(12);
monthPicker.setValue(calendar.get(Calendar.MONTH) + 1);
monthPicker.setWrapSelectorWheel(false);

//日期限制存在变化,需要根据当月最大天数来调整
datePicker.setMinValue(1);
datePicker.setMaxValue(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
datePicker.setValue(calendar.get(Calendar.DATE));
datePicker.setWrapSelectorWheel(false);

//24小时制,限制小时数为0~23
hourPicker.setMinValue(0);
hourPicker.setMaxValue(23);
hourPicker.setValue(calendar.get(Calendar.HOUR_OF_DAY));
hourPicker.setWrapSelectorWheel(false);

//限制分钟数为0~59
minutePicker.setMinValue(0);
minutePicker.setMaxValue(59);
minutePicker.setValue(calendar.get(Calendar.MINUTE));
minutePicker.setWrapSelectorWheel(false);

//为年份和月份设置监听
yearPicker.setOnValueChangedListener(this);
monthPicker.setOnValueChangedListener(this);

当选择器日期发生变化时,我们需要判断所显示的日期月份最多有多少天,防止出现不存在日期的情况,这时就需要为选择器值变动监听,因为年份和月份的变动都会影响当月最大天数,因此可以通过实现NumberPicker.OnValueChangeListener,重写onValueChange()方法来实现:

@Override
public void onValueChange(NumberPicker numberPicker, int i, int i1) {
    String dateStr = String.format(Locale.CHINA, "%d-%d", yearPicker.getValue(), monthPicker.getValue());
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM", Locale.CHINA);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(simpleDateFormat.parse(dateStr));
    int dateValue = datePicker.getValue();
    int maxValue = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    datePicker.setMaxValue(maxValue);
    //重设日期值,防止月份变动时超过最大值
    datePicker.setValue(Math.min(dateValue, maxValue));
}

这样一个自定义的可以同时选择日期和时间的选择器就基本完工了,以后还能自定义各个控件的样式来实现想要的效果。当然,获取选择器的结果可以通过定义一个Button来监听点击事件来获取

findViewById(R.id.button_confirm).setOnClickListener(view -> {
    //获取的日期时间结果
    String result = String.format(Locale.CHINA, "%d-%d-%d %d:%d",
            yearPicker.getValue(), monthPicker.getValue(), datePicker.getValue(),
            hourPicker.getValue(), minutePicker.getValue());
    ...
}

最后来看一下显示效果吧(PS:不知道为啥转gif会偏红)

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
安卓开发中,时间和日期选择器是常用的控件之一。它们可以帮助用户方便地选择时间和日期,使得应用程序更加易用。本文将对安卓开发中的时间和日期选择器进行总结。 时间选择器 时间选择器是用来选择时间的控件。在安卓中,可以使用 TimePicker 控件来创建时间选择器TimePicker 控件显示一个小时和分钟的滚动轴,用户可以通过滚动轴来选择时间。开发人员可以通过代码设置 TimePicker 的默认值、监听时间选择事件等。 以下是一个简单的使用 TimePicker 的例子: ``` <TimePicker android:id="@+id/timePicker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ``` 在代码中,可以通过 findViewById 方法获取 TimePicker 对象,并设置监听器来处理时间选择事件: ``` TimePicker timePicker = findViewById(R.id.timePicker); timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // 处理时间选择事件 } }); ``` 日期选择器 日期选择器是用来选择日期的控件。在安卓中,可以使用 DatePicker 控件来创建日期选择器DatePicker 控件显示一个日历,用户可以通过滚动日历来选择日期开发人员可以通过代码设置 DatePicker 的默认值、监听日期选择事件等。 以下是一个简单的使用 DatePicker 的例子: ``` <DatePicker android:id="@+id/datePicker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ``` 在代码中,可以通过 findViewById 方法获取 DatePicker 对象,并设置监听器来处理日期选择事件: ``` DatePicker datePicker = findViewById(R.id.datePicker); datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // 处理日期选择事件 } }); ``` 总结 时间和日期选择器是安卓开发中常用的控件之一。使用 TimePickerDatePicker 控件可以帮助用户方便地选择时间和日期开发人员可以通过代码设置默认值、监听事件等来适应不同的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值