NumberPicker是Android3.0之后引入的一个控件。NumberPicker
是用于选择一组提前定义好数字的控件。比方时间hour的选择仅仅有0—23有效,则能够通过setMinValue和setMaxValue设定。

使用该控件时需注意他的两个listener和一个formatter:一个listener用于监听当前value的变化;一个listener用于监听该控件的scroll状态;formatter用于格式化显示该控件中的value。

以下逐一介绍这几个接口:

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 。

详细的格式在format函数中规定,例如以下所看到的:

	public String format(int value) {
String Str = String.valueOf(value);
if (value < 10) {
Str = "0" + Str;
}
return Str;
}

value值在0—23之间,小于10的数在前面加上“0”。

介绍完NumberPicker后。就要实现我们今天的功能。首先先看效果图。例如以下所看到的:

是不是很美丽那,这样以后我们的项目中须要这样的效果,就直接就能够拿来用了。要实现这样的效果当然要先看我们的布局了,事实上布局里面就三个NumberPicker例如以下所看到的:

<?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="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:paddingLeft="3.0dip" > <NumberPicker
android:id="@+id/np_date"
android:layout_width="120.0dip"
android:layout_height="wrap_content"
android:button="@null" /> <NumberPicker
android:id="@+id/np_hour"
android:layout_width="50.0dip"
android:layout_height="wrap_content"
android:layout_marginLeft="5.0dip" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text=":"
android:textSize="20.0sp" /> <NumberPicker
android:id="@+id/np_minute"
android:layout_width="50.0dip"
android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>

就是这三个NumberPicker布局出我们刚才的效果,布局完毕我们就要找到这些控件。给他们加上监听。来实现一些功能。这里面是自己定义FrameLayout在直接填充布局做的。让我们来看看,例如以下所看到的:

package com.zqy.datetimepicker.datedialog;

import java.util.Calendar;

import com.zqy.datetimepicker.R;

import android.content.Context;
import android.text.format.DateFormat;
import android.widget.FrameLayout;
import android.widget.NumberPicker;
import android.widget.NumberPicker.OnValueChangeListener; public class DateTimePicker extends FrameLayout {
private final NumberPicker mDateSpinner;
private final NumberPicker mHourSpinner;
private final NumberPicker mMinuteSpinner;
private Calendar mDate;
private int mHour, mMinute;
private String[] mDateDisplayValues = new String[7];
private OnDateTimeChangedListener mOnDateTimeChangedListener; public DateTimePicker(Context context) {
super(context);
/*
*獲取系統時間
*/
mDate = Calendar.getInstance();
mHour = mDate.get(Calendar.HOUR_OF_DAY);
mMinute = mDate.get(Calendar.MINUTE);
/**
* 载入布局
*/
inflate(context, R.layout.datedialog, this);
/**
* 初始化控件
*/
mDateSpinner = (NumberPicker) this.findViewById(R.id.np_date);
mDateSpinner.setMinValue(0);
mDateSpinner.setMaxValue(6);
updateDateControl();
mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); mHourSpinner = (NumberPicker) this.findViewById(R.id.np_hour);
mHourSpinner.setMaxValue(23);
mHourSpinner.setMinValue(0);
mHourSpinner.setValue(mHour);
mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); mMinuteSpinner = (NumberPicker) this.findViewById(R.id.np_minute);
mMinuteSpinner.setMaxValue(59);
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setValue(mMinute);
mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener);
}
/**
*
* 控件监听器
*/
private NumberPicker.OnValueChangeListener mOnDateChangedListener = new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal);
/**
* 更新日期
*/
updateDateControl();
/**
* 给接口传值
*/
onDateTimeChanged();
}
}; private NumberPicker.OnValueChangeListener mOnHourChangedListener = new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mHour = mHourSpinner.getValue();
onDateTimeChanged();
}
}; private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mMinute = mMinuteSpinner.getValue();
onDateTimeChanged();
}
}; private void updateDateControl() {
/**
* 星期几算法
*/
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, -7 / 2 - 1);
mDateSpinner.setDisplayedValues(null);
for (int i = 0; i < 7; ++i) {
cal.add(Calendar.DAY_OF_YEAR, 1);
mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE",
cal);
}
mDateSpinner.setDisplayedValues(mDateDisplayValues);
mDateSpinner.setValue(7 / 2);
mDateSpinner.invalidate();
} /*
*接口回调 參数是当前的View 年月日小时分钟
*/
public interface OnDateTimeChangedListener {
void onDateTimeChanged(DateTimePicker view, int year, int month,
int day, int hour, int minute);
}
/*
*对外的公开方法
*/
public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
mOnDateTimeChangedListener = callback;
} private void onDateTimeChanged() {
if (mOnDateTimeChangedListener != null) {
mOnDateTimeChangedListener.onDateTimeChanged(this,mDate.get(Calendar.YEAR), mDate.get(Calendar.MONTH),
mDate.get(Calendar.DAY_OF_MONTH), mHour, mMinute);
}
}
}

这段代码就是找到这三个控件。分别给他们setMinValue(),setMaxValue(),也就是最大值和最小值,设置完毕后,我们给他们三个分别加上监听setOnValueChangedListener以下有三个监听方法,在mOnDateChangedListener这种方法了多了一个updateDateControl()方法,这个updateDateControl()方法里面主要是月份和星期几的关系算法。

写完这些,值也拿到了,可是我们须要把值传出去,以下我们又定义了一个接口来实现回调.接下来让我们在来看看对话框这个类,例如以下所看到的:

package com.zqy.datetimepicker.datedialog;

import java.util.Calendar;

import com.zqy.datetimepicker.datedialog.DateTimePicker.OnDateTimeChangedListener;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.text.format.DateUtils; public class DateTimePickerDialog extends AlertDialog implements
OnClickListener {
private DateTimePicker mDateTimePicker;
private Calendar mDate = Calendar.getInstance();
private OnDateTimeSetListener mOnDateTimeSetListener;
@SuppressWarnings("deprecation")
public DateTimePickerDialog(Context context, long date) {
super(context);
mDateTimePicker = new DateTimePicker(context);
setView(mDateTimePicker);
/*
*实现接口,实现里面的方法
*/
mDateTimePicker
.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
@Override
public void onDateTimeChanged(DateTimePicker view,
int year, int month, int day, int hour, int minute) {
mDate.set(Calendar.YEAR, year);
mDate.set(Calendar.MONTH, month);
mDate.set(Calendar.DAY_OF_MONTH, day);
mDate.set(Calendar.HOUR_OF_DAY, hour);
mDate.set(Calendar.MINUTE, minute);
mDate.set(Calendar.SECOND, 0);
/**
* 更新日期
*/
updateTitle(mDate.getTimeInMillis());
}
}); setButton("设置", this);
setButton2("取消", (OnClickListener) null);
mDate.setTimeInMillis(date);
updateTitle(mDate.getTimeInMillis());
}
/*
*接口回調
*控件 秒数
*/
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
/**
* 更新对话框日期
* @param date
*/
private void updateTitle(long date) {
int flag = DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE
| DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_TIME;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}
/*
* 对外公开方法让Activity实现
*/
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
} public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener != null) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
}
}

我们一行一行看。首先我们是继承AlertDialog。在以下我们new DateTimePicker,这个就是刚才写的类。我们这个类的对象实现我们刚才写的接口,把里面的值取到,尽管取到了,可是我们也不是在这里显示,所以我们还须要定义接口,让DateTimePickerDialog的对象去实现,以下就是我们的写的接口,我们写了那么多,仅仅为MainActivity里面的几行代码,让我们看看,例如以下所看到的:

package com.zqy.datetimepicker.activity;

import java.text.SimpleDateFormat;

import com.zqy.datetimepicker.R;
import com.zqy.datetimepicker.datedialog.DateTimePickerDialog;
import com.zqy.datetimepicker.datedialog.DateTimePickerDialog.OnDateTimeSetListener; import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity {
private Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) this.findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDialog();
}
});
} public void showDialog() {
DateTimePickerDialog dialog = new DateTimePickerDialog(this,
System.currentTimeMillis());
/**
* 实现接口
*/
dialog.setOnDateTimeSetListener(new OnDateTimeSetListener() {
public void OnDateTimeSet(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;
} }

首先我们还是new DateTimePickerDialog这个类,我们把系统时间传过去。这样时间对话框显示的就是系统时间了。我们用这个类的对象去实现我们刚才写的接口。实现里面的方法,我们又定义了一个 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss的方法,这样我用一个Toast把接口里面的值弹出来。

OK,这样我们就实现完毕了,有什么不明确的能够在以下留言。

源代码下载,请点击这里

Android日期对话框NumberPicker的使用方法教程的更多相关文章

  1. Android 日期对话框DatePickerDialog

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@ ...

  2. Android 日期对话框 DatePickerDialog

    private int year; private int monthOfYear; private int dayOfMonth; @Override protected void onCreate ...

  3. Android课程---时间日期对话框

    activity_ui2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  4. 9.Android之日期对话框DatePicker控件学习

    设置日期对话框在手机经常用到,今天来学习下. 首先设置好布局文件:如图 xml对应代码 <?xml version="1.0" encoding="utf-8&qu ...

  5. Android 中日期对话框的应用

    import java.util.Calendar; import android.widget.DatePicker; import android.app.DatePickerDialog; // ...

  6. Android内存管理(5)*官方教程:Logcat内存日志各字段含义,查看当前内存快照,跟踪记录内存分配,用adb查看内存情况时各行列的含义,捕获内存快照的3种方法,如何让程序暴漏内存泄漏的方法

    Investigating Your RAM Usage In this document Interpreting Log Messages                 内存分析日志中各消息的含 ...

  7. 【Android开发】 第一课 环境搭建教程

    Windows 开发环境部署: Android Studio 中文社区:http://www.android-studio.org/ 本教程将分为五个步骤来完成Android开发环境的部署. 第一步: ...

  8. Android时间对话框TimePickerDialog介绍

    目前网上流行着很多对“时间对话框TimePickerDialog”的讲解文章,但感觉都不是很详细.这里详细对该方面的知识进行介绍,旨在帮助初学者能够快速掌握该项技术. 首先要做的是声明一个日历类的对象 ...

  9. Android日期时间控件DatePickerDialog和TimePickerDialog

    1.DatePickerDialog 在一些万年历.日程表等APP上我们经常可以看到日期选择控件,由于很少有用户会老老实实的手工输入日期,所以该控件的作用就是为了控制用户的输入格式,在Android中 ...

随机推荐

  1. js处理浮点数计算误差

    众所周知,浮点计算会产生舍入误差的问题,比如,0.1+0.2,结果应该是0.3,但是计算的结果并不是如此,而是0.30000000000000004,这是使用基于IEEE754数值的浮点计算的通病,j ...

  2. rand()与 srand()

    一   头文件 <time.h> srand()就是给rand()提供种子seed. 在C语言中,srand()与rand()是随机函数,其中srand函数是伪随机数发生器的初始化函数,原 ...

  3. DOS的一些常用命令

    原文发布时间为:2011-02-12 -- 来源于本人的百度文章 [由搬家工具导入] DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /console cmd        运 ...

  4. Android build code command

    make bootimage -j8 make systemimage -j8

  5. 使用layer的iframe层提交表单后,需要关闭当前的iframe层,然后刷新父页面的方法2

    <input type="button" onclick="edit(${it.id?c})" class="layui-btn layui-b ...

  6. Linux centos 时间不同步 date 和 hwclock 时间不一致

    Linux centos 时间不同步 date 和 hwclock 网站有两台服务器,date 查看差3分钟 在应用 APP倒计时 与 直播,时时性较强的功能应用中 请求服务器后返回的服务器时间与数据 ...

  7. 牛客网 牛客小白月赛2 C.真真假假-String遍历比较

    C.真真假假 链接:https://www.nowcoder.com/acm/contest/86/C 这个题真的是无敌的水,但是自己写前面的string数组的时候,里面的这些头文件要用双引号(&qu ...

  8. webpack学习(一)安装和命令行、一次js/css的打包体验及不同版本错误

    一.前言 找了一个视频教程开始学习webpack,跟着视频学习,在自己的实际操作中发现,出现了很多问题.基本上都是因为版本的原因而导致,自己看的视频是基于webpack 1.x版,而自己现在早已是we ...

  9. 在Linux 双机下自己手动实现浮动ip技术

    两台Linux服务器,一台为主机(IP:124.158.26.30)对外提供了一定的网络服务,另一台从机(IP:124.158.26.31)能提供相同的服务,但ip地址没有对外部公开客户端连接的都是1 ...

  10. 渗透测试集成环境Faraday

    渗透测试集成环境Faraday   Kali Linux集成了海量的渗透测试工具.但是这些工具在使用的时候,还是分离的.虽然用户可以通过Shell.日志/报告导入导出功能等方式,进行整合,但是仍然不便 ...