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. System.Rtti.TRttiObject.GetAttributes 简例

    MAttribute = class(TCustomAttribute) private FName: string; public constructor Create(AName: string) ...

  2. linux 和 android 源码的 cross reference (即网页浏览代码的引用)

    linux: http://lxr.free-electrons.com/               相当好 android: http://androidxref.com

  3. VS2012编译可在WinXP兼容程序

    VS2012需要安装Update 1补丁 在Project的属性 选择 配置属性 - 常规 - 平台工具集 - Visual Studio 2012 - Windows XP (v110_xp) 在P ...

  4. [现代程序设计]homework-03

    Homework-03 队员: 11061193 薛亚杰 11061192 周敏轩    11061190 李孟 材料阅读 我们三个人将以下材料仔细阅读,觉得十分受益.下面是我们的总结和分享: 1)代 ...

  5. 浏览器插件-ActiveX

    浏览器插件:B/S模式下通过在客户端浏览器安装插件调用外设或者处理特殊格式数据. 常用插件有身份证阅读器.sim卡阅读器.银行卡校验插件.手写板插件.小键盘插件: 处理表格数据的华表插件.图片合成插件 ...

  6. 玩转轻巧型C/C++ IDE之C-Free(配置GCC、Visual C++、Borland C++编译器)

    玩转轻巧型C/C++ IDE之C-Free(配置GCC.Visual C++.Borland C++编译器) 之前在写一点简单的C/C++代码时习惯了VC++6.0,但是由于在windows7下VC6 ...

  7. ASP防注入

    因为在改进公司的一套ASP代码,所以考虑了一下防注入的问题. 参考了网上的几处代码,进行了修改和整合,都转换成小写再处理. 还考虑了script注入. 代码如下: 'Asp防注入代码 SQL_injd ...

  8. 如何在Visual Studio中选择C++和C#的编译器版本

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Visual Studio中选择C++和C#的编译器版本.

  9. TCP四种定时器--学习笔记

    TCP使用四种定时器: 重传定时器(Retransmission Timer).坚持定时器(Persistent Timer).保活定时器(Keeplive Timer).时间等待定时器(Time_W ...

  10. 判断sqlserver临时表等临时资源是否存在

    if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#TEMP'))  drop table #TEMP