DatePicker、TimePicker的使用

DatePicker的使用

1.DatePicker是Android自带的一个日期选择期控件,能够实现日期的联动选择。使用比较简单,下面介绍一下简单的使用以及注意的点。
* 简单使用
首先在xml 中加入DatePicker的控件(用了最新的ConstraintLayout,不熟可以忽略)

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.test.customtimepick.MainActivity">

    <DatePicker
        android:id="@+id/data"
        android:calendarViewShown="false"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/time"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

在代码中,先初始化变量,然后调用
init(int year, int monthOfYear, int dayOfMonth, DatePicker.OnDateChangedListener onDateChangedListener)方法初始化日期值并设置日期改变的监听

calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH)+1;  //注意MONTH从0开始算
day = calendar.get(Calendar.DAY_OF_MONTH);
hour = calendar.get(Calendar.HOUR_OF_DAY);
min = calendar.get(Calendar.MINUTE);
setTitle(year + "-" + month + "-" + day + "  " + hour + ":" + min);

data.init(year,month,day,new DatePicker.OnDateChangedListener() {
    @Override
    public void onDateChanged(DatePicker datePicker, int year1, int month1, int day1) {
        year = year1;
        month = month1+1;
        day = day1;
        setTitle(year + "-" + month + "-" + day + "  " + hour + ":" + min);
    }
});

一个简单的日期选择期功能就基本完成了,至于其他的功能参考官方文档有详细的API说明DatePicker说明

  • 注意事项
    DatePicker在android4.4以下和5.0以上的默认呈现形式不太一样。
    在4.4以下默认显示

5.0以上显示

DatePicker通常都会和TimePicker一同使用,为了不让在4.4以下显示日历形式占用太多空间,可以使用属性android:calendarViewShown=“false”隐藏日历的显示,但在5.0以上设置此属性则不行。(android:spinnersShown是否显示spinner)
DatePicker的显示形式有几种模式,由android:datePickerMode属性决定,有calendar形式和spinners形式,在4.4以下默认都显示,在5.0以上默认为calendar模式。在spinners模式下,年份的选择是以spinner形式选择的,而在calendar模式下则是通过点击年份以list的形式选择。
2.TimePicker的使用
TimePicker的使用和DatePicker类似,只是初始化的方式不同

hour = calendar.get(Calendar.HOUR_OF_DAY);
min = calendar.get(Calendar.MINUTE);
time.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
    @Override
    public void onTimeChanged(TimePicker timePicker, int hour1, int min1) {
        hour = hour1;
        min = min1;
        setTitle(year + "-" + month + "-" + day + "  " + hour + ":" + min);
    }
});

改变picker宽度和字体大小颜色

1.改变宽度
DatePicker和TimePicker经常一起使用水平并列排放,由于空间问题一般使用spinners模式,不显示日历。但是在竖屏模式的时候,可能宽度还是不够,而单个picker宽的度没有相应的属性可以设置宽度,但因为DatePicker和TimePicker是由一个个numberPicker组成的,所以可以通过在代码中改变numberPicker的宽度来达到此目的。

/**
* 调整FrameLayout的大小
* */
private void resizePicker(FrameLayout tp){        //DatePicker和TimePicker继承自FrameLayout
    List<NumberPicker> npList = findNumberPicker(tp);  //找到组成的NumberPicker
    for(NumberPicker np:npList){
        resizeNumberPicker(np);      //调整每个NumberPicker的宽度
    }
}
 /**
 * 得到viewGroup 里面的numberpicker组件
 * */
 private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {
     List<NumberPicker> npList = new ArrayList<NumberPicker>();
     View child = null;
     if(null != viewGroup){
         for(int i=0;i<viewGroup.getChildCount();i++){
             child = viewGroup.getChildAt(i);
             if(child instanceof NumberPicker){
                 npList.add((NumberPicker)child);
             }else if(child instanceof LinearLayout){
                 List<NumberPicker> result = findNumberPicker((ViewGroup) child);
                 if(result.size()>0){
                     return result;
                 }
             }
         }
     }
     return npList;
 }

 /**
  * 调整numberpicker大小
  * */
 private void resizeNumberPicker(NumberPicker np){
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, ViewGroup.LayoutParams.WRAP_CONTENT);
     params.setMargins(10,5,10,5);
     np.setLayoutParams(params);
 }

调用时只需将相应组件传入

data = (DatePicker)findViewById(R.id.data);
time = (TimePicker)findViewById(R.id.time);
resizePicker(data);
resizePicker(time);

2.改变字体样式
在style.xml中自定义字体的样式

<style name="Theme.Picker" parent="Theme.AppCompat.Light">
    <item name="android:editTextStyle">@style/Widget.EditText.White</item>
</style>
<style name="Widget.EditText.White" parent="@android:style/Widget.EditText">
    <item name="android:textSize">20sp</item>
    <item name="android:textColor">#00ff00</item>
</style>

然后在AndroidManifest.xml中对应的activity设置主题为相应的名称

<activity android:name=".MainActivity"
    android:screenOrientation="landscape"
    android:theme="@style/Theme.Picker"
    >

DatePickerDialog和TimePickerDialog

DatePickerDialog和TimePickerDialog也是一种常见的日期选择形式,他们以弹框的形式出现,基本的使用如下:

dataDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
        year = i; month = i1; day = i2;
        setTitle(year + "-" + month + "-" + day + "  " + hour + ":" + min);
    }
}, year, month, day);
timeDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker timePicker, int i, int i1) {
        hour = i; min = i1;
        setTitle(year + "-" + month + "-" + day + "  " + hour + ":" + min);
    }
},hour,min,true);

dataDialog.show();
timeDialog.show();

如果想改变弹框里的样式可类似DatePicker那样来实现

resizePicker(dataDialog.getDatePicker());   //改变日期选择期大小
WindowManager.LayoutParams p = dataDialog.getWindow().getAttributes(); //改变对话框大小
p.width = 1000;
p.height = 800;
dataDialog.show();