使用NumberPicker定制自己喜欢的Date&TimePicker
1.NumberPicker简介:
NumberPicker是Android3.0之后引入的一个控件,主要功能是用于选择一组预定义好数字的控件。
该控件主要需要指导一个用于监听当前value变化的listener、一个用于监听该控件scroll状态的listener和一个用于格式化显示该控件中value的formatter:
1) NumberPicker.OnValueChangeListener :其函数public void onValueChange(NumberPicker picker, int oldVal, int newVal) ;oldVal前一个选中的值,newValue当前选中的值。
2) NumberPicker.OnScrollListener:其内部有三种scroll状态SCROLL_STATE_FLING 、 SCROLL_STATE_IDLE 、 SCROLL_STATE_TOUCH_SCROLL。
SCROLL_STATE_TOUCH_SCROLL:用户按下去然后滑动。
SCROLL_STATE_FLING: 相当于是SCROLL_STATE_TOUCH_SCROLL的后续滑动操作。
SCROLL_STATE_IDLE: NumberPicker不在滚动。
3) NumberPicker.Formatter: 格式化显示数字,例如0—23格式化为00 — 23 。
2.使用NumberPicker定制Date&TimePicker:
1) 创建布局样式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:paddingRight="10dp"> <NumberPicker
android:id="@+id/date_year_picker"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1" /> <NumberPicker
android:id="@+id/date_mouth_picker"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1" /> <NumberPicker
android:id="@+id/date_day_picker"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
2) 继承FrameLayout实现填充布局
package com.snd.picker; import android.content.Context;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.NumberPicker; import java.util.Calendar; /**
* Created by Hebo-KA-0045 on 2016/10/9.
*/ public class DatePicker extends FrameLayout { private int mYear, mMonth, mDay;// 当前年月日
private String[] mDateDisplayValues = new String[7];
private Calendar mDate; private NumberPicker mDateYearPicker, mDateMonthPicker, mDateDayPicker; private OnDateChangedListener mOnDateChangedListener; public DatePicker(Context context) {
super(context);
mDate = Calendar.getInstance();
mYear = mDate.get(Calendar.YEAR);
mMonth = mDate.get(Calendar.MONTH);
mDay = mDate.get(Calendar.DAY_OF_MONTH); init(context);// 加载布局文件,并初始化相应控件
} /**
* 加载布局,并初始化控件
*
* @param context
*/
private void init(Context context) {
inflate(context, R.layout.date_picker_dialog, this);// 加载布局 /**
* 初始化控件
*/
mDateYearPicker = (NumberPicker) this.findViewById(R.id.date_year_picker);
mDateYearPicker.setMinValue(1900);
mDateYearPicker.setMaxValue(2100);
mDateYearPicker.setValue(mYear);
mDateMonthPicker = (NumberPicker) this.findViewById(R.id.date_mouth_picker);
mDateMonthPicker.setMinValue(1);
mDateMonthPicker.setMaxValue(12);
mDateMonthPicker.setValue(mMonth + 1);
mDateDayPicker = (NumberPicker) this.findViewById(R.id.date_day_picker);
mDateDayPicker.setMinValue(1);
mDateDayPicker.setMaxValue(getDaysInMonthAndYear(mYear, mMonth - 1));
mDateDayPicker.setValue(mDay); initListener(context);
} /**
* 初始化监听器
*/
private void initListener(final Context context) {
mDateYearPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mDate.add(Calendar.YEAR, newVal - oldVal);
mYear = mDateYearPicker.getValue();
mDateDayPicker.setMaxValue(getDaysInMonthAndYear(mYear, mMonth));
if (mYear == 1900 || mYear == 2100) {
mDateYearPicker.setWrapSelectorWheel(false);
} else if (mYear > Calendar.YEAR) {
}
onDateChanged();
}
});
mDateMonthPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mDate.add(Calendar.MONTH, newVal - oldVal);
mMonth = mDateMonthPicker.getValue();
mDateDayPicker.setMaxValue(getDaysInMonthAndYear(mYear, mMonth));
onDateChanged();
}
});
mDateDayPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal);
mMonth = mDateMonthPicker.getValue();
mDay = mDateDayPicker.getValue();
onDateChanged();
}
});
} /**
* 获取某一年某一月的天数
*
* @param year
* @param month 取值范围1-12
* @return
*/
private int getDaysInMonthAndYear(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
return calendar.getActualMaximum(Calendar.DATE); } private void onDateChanged() {
if (mOnDateChangedListener != null) {
mOnDateChangedListener.onDateChanged(this, mYear, mMonth, mDay);
}
} /*
*对外的公开方法
*/
public void setOnDateTimeChangedListener(OnDateChangedListener listener) {
mOnDateChangedListener = listener;
} public interface OnDateChangedListener {
void onDateChanged(DatePicker view, int year, int month, int day);
}
}
3) 实现自定义Dialog
package com.snd.picker; import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.format.DateUtils; import java.util.Calendar; /**
* Created by Hebo-KA-0045 on 2016/10/9.
*/
public class DatePickerDialog extends AlertDialog implements DialogInterface.OnClickListener { private DatePicker mDatePicker;
private Calendar mDate; private OnDateSetListener mOnDateSetListener; @Override
public void onClick(DialogInterface dialog, int which) {
if (mOnDateSetListener != null) {
mOnDateSetListener.OnDateSet(this, mDate.getTimeInMillis());
}
} public DatePickerDialog(Context context, long date) {
super(context);
mDate = Calendar.getInstance();
mDatePicker = new DatePicker(context);
setView(mDatePicker);
mDatePicker.setOnDateTimeChangedListener(new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
mDate.set(Calendar.YEAR, year);
mDate.set(Calendar.MONTH, month - 1);
mDate.set(Calendar.DAY_OF_MONTH, day); updateTitle(mDate.getTimeInMillis());
}
}); setButton("确定", this);
mDate.setTimeInMillis(date);
updateTitle(mDate.getTimeInMillis());
} private void updateTitle(long date) {
int flag = DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
} /*
* 对外公开方法让Activity实现
*/
public void setOnDateSetListener(OnDateSetListener listener) {
mOnDateSetListener = listener;
} /**
* 接口回调
* 控件 秒数
*/
public interface OnDateSetListener {
void OnDateSet(AlertDialog dialog, long date);
}
}
4) 使用
package com.snd.picker; import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; import java.text.SimpleDateFormat; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_acty); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatePickerDialog dialog = new DatePickerDialog(MainActivity.this,
System.currentTimeMillis());
/**
* 实现接口
*/
dialog.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
@Override
public void OnDateSet(AlertDialog dialog, long date) {
Toast.makeText(MainActivity.this,
"您输入的日期是:" + getStringDate(date), Toast.LENGTH_LONG)
.show();
}
});
dialog.show();
}
});
} /**
* 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
*/
public static String getStringDate(Long date) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(date);
return dateString;
}
}
使用NumberPicker定制自己喜欢的Date&TimePicker的更多相关文章
- 第七节:详细讲解Java中的日期,java.util.date
前言 大家好,给大家带来详细讲解Java中的日期,java.util.date的概述,希望你们喜欢 类Date Java.lang.Object->java.util.Date public c ...
- 【SpringBoot系列4】SpringBoot定制自己的bean
起因:SpringBoot我是越用越喜欢,但当SpringBoot出了问题的时候,我却无从下手,因为封装实在是太高度化了.然后之前有一个需求,使用SpringBoot提供的StringRedisTem ...
- TimePicker 时间选择器
用于选择或输入日期 固定时间点 提供几个固定的时间点供用户选择 使用 el-time-select 标签,分别通过star.end和step指定可选的起始时间.结束时间和步长 <el-time- ...
- html5高级
Html5高级 项目回顾 Day 01 第三阶段知识体系: (1)AJAX异步请求 数据库.PHP.HTTP.原生AJAX.jQuery中的AJAX (2)HTML5高级特性 九大新特性 (3)Boo ...
- Git log、diff、config 进阶
前一段时间分享了一篇<更好的 git log>简要介绍怎么美化 git log 命令,其中提到了 alias命令,今天再继续谈谈 git相关, 看看如何通过配置自己的 git config ...
- 40 个让你的网站更加友好的 jQuery 插件
一个插件的基本功能是执行一个含有元素集合的函数数组.每个方法和jQuery核心组成一个插件,如.fadeOut()或.addClass().一个jQuery插件是一个基本的可以扩充jQuery 原型对 ...
- 40个让你的网站屌到爆的jQuery插件
一 个插件的基本功能是执行一个含有元素集合的函数数组.每个方法和jQuery核心组成一个插件,如.fadeOut()或.addClass().一个 jQuery插件是一个基本的可以扩充jQuery 原 ...
- 超详细的Xcode代码格式化教程,可自定义样式
为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题. 在之前,我们可能会写完代码后,再一点一点去调格式,很浪费时间. 有了ClangF ...
- ytkah网站建设解决方案 大中小微企业营销利器
为大中小微企业提供网站设计制作优化服务,PC移动微网站三合一,抢占市场先机.读万卷书不如走万里路,走万里路不如阅人无数.说再多空洞无物不如上案例几簇 优秀案例展示,上市公司人人网旗下游戏<天书奇 ...
随机推荐
- Hold住:坚持的智慧
这类励志的书读完时,感觉很激励人,可读完后总觉得空空的.同样这本书读完后没特别的感觉(也许书中的思想已影响了我,只是目前还说不太清楚),只感觉有些句子很有感觉,做个汇总: 1. 荀子有言:“ ...
- the application could not be verified
在iphone上安装app时,提示the application could not be verified 解决方式: 将iphone已有的这个app卸载,然后安装就可以了.
- 第三次作业,GUI设计之最大子序列和
先吐槽一发!!!学渣表示作业太难了啊!!!!!!做一次作业要用好久好久,要问好多好多大神才能行,虽然确实提高不少,花的时间真是……!!!!! 这次作业费劲心血,希望老师能给个好分数,至少对于学渣来说已 ...
- 快速切换目录软件推荐——autojump
受到<autojump: 在命令行下快速更改目录>的鼓动,决定试用下这个软件. 但ubuntu下的源貌似有些问题, sudo apt get install autojump 后,死活提示 ...
- POJ 1502 MPI Maelstrom(最短路)
MPI Maelstrom Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4017 Accepted: 2412 Des ...
- java封装对象转json字符串
/** * Copyright (c) 2011-2015, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License ...
- opencv 矩阵的相似性对比 (图片之间比较)
测试图片: code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\c ...
- String 和 byte[]
使用默认字符集合 Encodes this String into a sequence of bytes using the platform's default charset, storing ...
- TypeScript学习笔记(四):函数
这篇笔记我们来看看TypeScript中的函数. 函数类型 在JavaScript中存在两种定义函数的方法,如下: //命名函数 function add(x, y) { return x+y; } ...
- linux 下安装apache 快速教程
最近自学linux,看鸟哥的文章.提到了apache,所以在虚拟机redhat 5下安装了一把, 结合国内外文章写下快速可行的教程: --------------------------------- ...