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. bash里,echo对换行符的处理

    echo -e "#include <stdio.h>\nint main()\n{\n printf(\"hello world\\\n\");\n ret ...

  2. MATLAB / Simulink on BeagleBone Black

    转自:beagleboard@googlegroups.com邮件组 作者:kevind I have MATLAB / Simulink working with BeagleBone Black. ...

  3. JAVA——利用wait和notify实现生产者和消费者

    经典的消费者和生产者的的实现: 注意事项: 1:在循环里面用wait(),因为当线程获得了锁,但是有可能还没有满足其他条件: 2:公用的缓冲池要用锁机制: package demo; import j ...

  4. [MAC OSX - 1] OSX10.10不能安装JKD8,不能使用eclipse

    (1)电脑升级为10.10后,打开eclipse总是提示"您需要安装旧 Java SE 6 运行环境才能打开"Eclipse". 解决:安装JKD   (2)不能安装JK ...

  5. uva10474 简单排序查找 一次AC

    题目很简单,加上读题20分钟一次AC.还是用到了快排qsort. #include<iostream> #include<cstdlib> using namespace st ...

  6. 集合引入(ArrayList、LinkedList)

    1.引入 代替数组固定大小操作不变 2.ArrayList 常用的操作(add,remove) 3.LinkedList 能实现一些特殊的操作(pop)

  7. git 入门学习笔记

    安装msysgit (模拟环境Git)安装后绑定邮箱和名字$ git config --global user.name "Your Name"$ git config --glo ...

  8. ASP获取json天气信息

    ASP代码(ASP获取页面源码方法,有编码.超时时间参数,处理了乱码.超时的问题): Function GetHttpPage(HttpUrl) Then GetHttpPage="$Fal ...

  9. C++成员变量、构造函数的初始化顺序

    一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...

  10. 根据powerdesigner的OO模型生成C#代码

    2007-05-15 08:34:11|  分类: 转贴部分 |  标签:学习帖子 |字号 订阅 习惯了用Powerdesigner设计数据库模型,XDE设计类图.因此我一般的设计方法是用PD做分析模 ...