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的更多相关文章

  1. 第七节:详细讲解Java中的日期,java.util.date

    前言 大家好,给大家带来详细讲解Java中的日期,java.util.date的概述,希望你们喜欢 类Date Java.lang.Object->java.util.Date public c ...

  2. 【SpringBoot系列4】SpringBoot定制自己的bean

    起因:SpringBoot我是越用越喜欢,但当SpringBoot出了问题的时候,我却无从下手,因为封装实在是太高度化了.然后之前有一个需求,使用SpringBoot提供的StringRedisTem ...

  3. TimePicker 时间选择器

    用于选择或输入日期 固定时间点 提供几个固定的时间点供用户选择 使用 el-time-select 标签,分别通过star.end和step指定可选的起始时间.结束时间和步长 <el-time- ...

  4. html5高级

    Html5高级 项目回顾 Day 01 第三阶段知识体系: (1)AJAX异步请求 数据库.PHP.HTTP.原生AJAX.jQuery中的AJAX (2)HTML5高级特性 九大新特性 (3)Boo ...

  5. Git log、diff、config 进阶

    前一段时间分享了一篇<更好的 git log>简要介绍怎么美化 git log 命令,其中提到了 alias命令,今天再继续谈谈 git相关, 看看如何通过配置自己的 git config ...

  6. 40 个让你的网站更加友好的 jQuery 插件

    一个插件的基本功能是执行一个含有元素集合的函数数组.每个方法和jQuery核心组成一个插件,如.fadeOut()或.addClass().一个jQuery插件是一个基本的可以扩充jQuery 原型对 ...

  7. 40个让你的网站屌到爆的jQuery插件

    一 个插件的基本功能是执行一个含有元素集合的函数数组.每个方法和jQuery核心组成一个插件,如.fadeOut()或.addClass().一个 jQuery插件是一个基本的可以扩充jQuery 原 ...

  8. 超详细的Xcode代码格式化教程,可自定义样式

    为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题. 在之前,我们可能会写完代码后,再一点一点去调格式,很浪费时间. 有了ClangF ...

  9. ytkah网站建设解决方案 大中小微企业营销利器

    为大中小微企业提供网站设计制作优化服务,PC移动微网站三合一,抢占市场先机.读万卷书不如走万里路,走万里路不如阅人无数.说再多空洞无物不如上案例几簇 优秀案例展示,上市公司人人网旗下游戏<天书奇 ...

随机推荐

  1. java开发者最常去的20个英文网站

    java开发者最常去的20个英文网站: 1.[http://www.javaalmanac.com] Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的 ...

  2. arduino图形化编程——ardublock

    下载地址:http://sourceforge.net/projects/ardublock/ 项目主页:https://github.com/taweili/ardublock 运行效果图 ardu ...

  3. FIREDAC连接SQLITE乱码的解决

    在好多群里面都碰到问“FIREDAC连接SQLITE乱码的”的问题的同仁,遂将解决方法贴出来: 如上图所示设置 stringFormat为unicode即可

  4. 嵌入式LINUX入门到实践(一)

    MINI2440 IIC协议 IIC协议在工程中应用广泛,在我看来,此协议的优势就在于其硬件及其简单,结构清晰. 首先来解读一下S3C2440A这款芯片的IIC协议. 一.一个协议的解读从如上结构图中 ...

  5. CodeForces 589J Cleaner Robot (DFS,或BFS)

    题意:给定n*m的矩阵,一个机器人从一个位置,开始走,如果碰到*或者边界,就顺时针旋转,接着走,问你最后机器人最多能走过多少格子. 析:这个题主要是题意读的不大好,WA了好几次,首先是在*或者边界才能 ...

  6. MySQL BINARY和BIT类型

    BINARY和VARBINARY类型 BINARY和VARBIANRY类型同CHAR和VARCHAR类型相似,除了BIANARY和VARBINARY类型只包含二进制字符串,即它们只包含byte串而非字 ...

  7. 被mysql中的wait_timeout坑了

    今天被mysql里的wait_timeout坑了         网上能搜到很多关于mysql中的wait_timeout相关的文章,但是大多数只是说明了他的作用,而且都说这个参数要配合那个inter ...

  8. "file:///" file 协议

    [问题] 在WLW中拖入本地图片文件,然后调试过程中,选中对应图片,看到获得的对应的html源码中,图片地址是这样的: href="file:///C:/Users/CLi/AppData/ ...

  9. 命令行创建maven模块工程

    上一边文章,借助外部eclipse来创建模块项目,本文直接使用maven命令来创建 mvn archetype:generate -DgroupId=com.mycompany.demo -Darti ...

  10. hdu 5587 Array 数学题

    Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5587 De ...