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. Codeforces Educational Codeforces Round 15 A. Maximum Increase

    A. Maximum Increase time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. cocos2d-x获得系统的语言

    获得手机系统的语言 CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCLabelTTF *label = CCLabe ...

  3. Java设计模式系列之中介者模式

    中介者模式(Mediator)的定义 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式(Mediator)的适 ...

  4. URAL 2037 Richness of binary words (回文子串,找规律)

    Richness of binary words 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/B Description Fo ...

  5. POJ 2031 Building a Space Station (最小生成树)

    Building a Space Station 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/C Description Yo ...

  6. display:none;与visibility:hidden;的区别

    visibility:隐藏对应的元素但不挤占该元素原来的空间.display:隐藏对应的元素并且挤占该元素原来的空间. 下面来看visibility和dispaly的一些参数 visibility用来 ...

  7. 转载yield关键字理解

    实现IEnumerable接口及理解yield关键字   [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...

  8. Educational Codeforces Round 14 D. Swaps in Permutation (并查集orDFS)

    题目链接:http://codeforces.com/problemset/problem/691/D 给你n个数,各不相同,范围是1到n.然后是m行数a和b,表示下标为a的数和下标为b的数可以交换无 ...

  9. hdu 4781 Assignment For Princess (2013ACMICPC 成都站 A)

    http://acm.hdu.edu.cn/showproblem.php?pid=4781 由于题目太长,这里就不直接贴了,直接说大意吧. 题目大意:有一个n个点,m条边的有向图,每条边的权值分别为 ...

  10. sqlserver2012

    sqlserver2012作死的节奏啊,微软最近怎么了?搞个sqlserver2012死活安装不上,无论如何都是.NET Framework 4报错,机器本身的版本比安装包的高就报错?微软的程序员思维 ...