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();