这个开源项目是模仿Google官方的time选择器做的,是否漂亮。让我爱不释手,真心喜欢。很有幸和大家一起分享下,那么话不多说开始讲解。

开源项目地址:https://github.com/flavienlaurent/datetimepicker

这个项目依赖于NineOldAndroids https://github.com/JakeWharton/NineOldAndroids

我这里直接将NineOldAndroids作为jar包copy到我给的lib中了,所以大家只需要使用一个lib就好。

原理:其实这个dialog就是一个fragmentDialog,所以我们可以直接启动这个控件就行了,不用任何布局文件的支持。此外我们还需要绑定监听器来判断用户的选择信息。下面是项目实现。

一、布局文件(就几个按钮,没啥好说的)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity" > <CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="vibrate"
android:layout_marginBottom="30dp"
android:id="@+id/checkBoxVibrate"
android:checked="true"/> <CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="close on single tap day"
android:layout_marginBottom="30dp"
android:id="@+id/checkBoxCloseOnSingleTapDay"
android:checked="true"/> <Button
android:id="@+id/dateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:text="Select Date" /> <CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="close on single tap minute"
android:layout_marginBottom="30dp"
android:id="@+id/checkBoxCloseOnSingleTapMinute"
android:checked="true"/> <Button
android:id="@+id/timeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select Time" /> </LinearLayout>

java代码(里面注释已经很详尽了,十分简单易用):

package com.kale.datatimepicker;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.Toast; import com.fourmob.datetimepicker.date.DatePickerDialog;
import com.fourmob.datetimepicker.date.DatePickerDialog.OnDateSetListener;
import com.sleepbot.datetimepicker.time.RadialPickerLayout;
import com.sleepbot.datetimepicker.time.TimePickerDialog; import java.util.Calendar; public class MainActivity extends FragmentActivity implements OnDateSetListener, TimePickerDialog.OnTimeSetListener { public static final String DATEPICKER_TAG = "datepicker";
public static final String TIMEPICKER_TAG = "timepicker"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final Calendar calendar = Calendar.getInstance(); final DatePickerDialog datePickerDialog = DatePickerDialog.newInstance(this,
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
isVibrate()); final TimePickerDialog timePickerDialog = TimePickerDialog.newInstance(this,
calendar.get(Calendar.HOUR_OF_DAY) ,
calendar.get(Calendar.MINUTE),
false, false);//最后两个参数,是否是24小时制,是否抖动。推荐false,false findViewById(R.id.dateButton).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
datePickerDialog.setVibrate(isVibrate());//是否抖动,推荐true
datePickerDialog.setYearRange(1985, 2028);//设置年份区间
datePickerDialog.setCloseOnSingleTapDay(isCloseOnSingleTapDay());//选择后是否消失,推荐false
datePickerDialog.show(getSupportFragmentManager(), DATEPICKER_TAG);//展示dialog,传一个tag参数
}
}); findViewById(R.id.timeButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
timePickerDialog.setVibrate(isVibrate());//是否抖动
timePickerDialog.setCloseOnSingleTapMinute(isCloseOnSingleTapMinute());//选择后是否消失,推荐false
timePickerDialog.show(getSupportFragmentManager(), TIMEPICKER_TAG);//展示dialog,传一个tag参数
}
}); //保存状态
if (savedInstanceState != null) {
DatePickerDialog dpd = (DatePickerDialog) getSupportFragmentManager().findFragmentByTag(DATEPICKER_TAG);
if (dpd != null) {
dpd.setOnDateSetListener(this);
} TimePickerDialog tpd = (TimePickerDialog) getSupportFragmentManager().findFragmentByTag(TIMEPICKER_TAG);
if (tpd != null) {
tpd.setOnTimeSetListener(this);
}
}
} private boolean isVibrate() {
return ((CheckBox) findViewById(R.id.checkBoxVibrate)).isChecked();
} private boolean isCloseOnSingleTapDay() {
return ((CheckBox) findViewById(R.id.checkBoxCloseOnSingleTapDay)).isChecked();
} private boolean isCloseOnSingleTapMinute() {
return ((CheckBox) findViewById(R.id.checkBoxCloseOnSingleTapMinute)).isChecked();
} //日期设置的监听器,得到年月日
@Override
public void onDateSet(DatePickerDialog datePickerDialog, int year, int month, int day) {
Toast.makeText(MainActivity.this, "new date:" + year + "-" + month + "-" + day, Toast.LENGTH_LONG).show();
} //时间设置的监听器,得到时分
@Override
public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
/**
* 这里返回的hourOfDay是24小时制的小时,就是说无论你设置的timePicker是否是24小时制,这里都返回24小时制的小时。
* 很方便我们来做判断。比如如果hourOfDay>12就说明是下午了。
*/
Toast.makeText(MainActivity.this, "new time:" + hourOfDay + "-" + minute, Toast.LENGTH_LONG).show();
}
}

下面重点来了,如何修改开源项目中选择框的颜色。

我先给出默认的配色方案:

下面我将这几个配色属性进行编号,我还做了按编号来展示的示意图片。

根据不同的编号属性,进行单一变量的设置。图解如下:

:-(,我真是操碎了心啊。好啦,这样就大功告成了,下面是源码下载。PS:这个源码下载中我还附上了讲解的图片,方便大家查看。

源码下载:http://download.csdn.net/detail/shark0017/8080835

开源项目DataTimePicker实现时间和日期的选择的更多相关文章

  1. 7.Android开源项目WheelView的时间和地址联动选择对话框

    类似WheelView的时间和地址联动选择对话框在现在App经常看到,今天小结下. 主布局界面: <LinearLayout xmlns:android="http://schemas ...

  2. 阿里巴巴的26款超神Java开源项目,有时间阅读一下各个文档,增添一下知识广度

    1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案.此项目包含开发分布式应用服务的 ...

  3. Android开发:为什么我们从来不去感谢开源项目维护者?

    今天我想谈一谈,为什么我们很少去感谢开源项目维护者: 一.这样的项目我也可以做啊 “蛤?这项目对我来说也太简单了吧.” “我一周之内就能做一个更好的版本出来.” 确实,很多人都可以在 Hackatho ...

  4. HelloGitHub 月刊最受欢迎的开源项目 Top10(2020 年)

    作者:HelloGitHub-卤蛋 2020 年已成往事,2021 年悄然而至. 在已经过完的 2020 年里 HelloGitHub 共发布了 12 期月刊,推荐了 419 个开源项目.​每个月的 ...

  5. Android Studio导入GitHub上的项目常见问题(以图片轮播开源项目为实例)

    前言:github对开发者而言无疑是个宝藏,但想利用它可不是件简单的事,用Android studio导入开源项目会遇到各种问题,今天我就以github上的一个图片轮播项目为例,解决导入过程中的常见问 ...

  6. 项目心得——按照指定的日期/时间创建Date对象

    项目心得——按照指定的日期/时间创建Date对象 有时,在做项目中,需要获得指定日期的Date对象,这个指定的日期或者时间可能不是当前的时间.下面讲解两种获取指定日期/时间的Date对象的方法: pa ...

  7. 一个基于 Vue3 的开源项目,3个月时间 star 终于破千!

    本文主要是对如何做开源项目的一些思考. 前文回顾: <Vue3 来了,Vue3 开源商城项目重构计划正式启动!> <一个基于 Vue 3 + Vant 3 的开源商城项目> 关 ...

  8. 这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧

    注意:有网友提出部分项目停止更新的事情,这个问题我特意注意过,很多都是小功能组件,功能稳定,没有bug,没更新是正常的.够用就行了.其次技术支持的事情,对开源免费来说,不能太强求,这里发布的都是小功能 ...

  9. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

随机推荐

  1. Codeforces Round #254 (Div. 1) D - DZY Loves Strings

    D - DZY Loves Strings 思路:感觉这种把询问按大小分成两类解决的问题都很不好想.. https://codeforces.com/blog/entry/12959 题解说得很清楚啦 ...

  2. homestead实现外部局域网络其他主机的访问

    转载自:https://blog.csdn.net/u013659696/article/details/78455362 homestead 2.0 MAC环境 修改Homestead目录下的Vag ...

  3. 033 Java Spark的编程

    1.Java SparkCore编程 入口是:JavaSparkContext 基本的RDD是:JavaRDD 其他常用RDD: JavaPairRDD JavaRDD和JavaPairRDD转换: ...

  4. 高能天气——团队Scrum冲刺阶段-Day 3

    高能天气--团队Scrum冲刺阶段-Day 3 今日完成任务 于欣月:完成天气预报部分收尾工作 余坤澎:进行特别关心的实现 康皓越:实现闹钟部分添加音乐 范雯琪:初步开始界面优化,寻找天气预报部分的背 ...

  5. 001.LVM简介

    一 概念 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上集合,相 ...

  6. odoo 工作流

    odoo工作流 介绍 新版本的odoo开始减少workflow的使用,推荐使用workflow-ish的方式来处理工作流过程 很多模块中还是使用到工作流,这里我记录一个简单的实例,欢迎大家给出建议. ...

  7. List,Set的区别

    1.List,Set都是继承自Collection接口2.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该 ...

  8. 内存缓存 ehcache

    内存缓存需要对内存缓存每个参数的配置意义搞明白,才能很好地去使用,例如失效时间.存活时间. 是否存储在磁盘.是否永久有效,参数要了解清楚后进行使用,不要在不清楚时盲目使用,会导致意想不到 的问题发生. ...

  9. 开源的在线评测系统——Vakuum

    项目地址 http://code.google.com/p/vakuum-oj/ https://github.com/BYVoid/vakuum 简介 Vakuum是一个基于Linux+PHP的在线 ...

  10. nodejs备忘总结(一) -- 基础入门

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...