Aandroid日历Dialog
Dialog效果图:
我们一步一步来实现上面的效果
第一步:先实现如上图的效果
分析
1.要有一个操作日期的工具类(Utils) 此类主要功能 当前日期月份的最大天数 日期月份的1号数星期几? 日期的上一个月最大天数
2. 通过Utils 获取 lastDates contentDates nextDates 三个日期数据集合
3. 创建GridView实例 显示 lastDates contentDates nextDates 三个日期数据集合
GridViewAdapter 源码如下:
public class DateGridViewAdapter extends BaseAdapter {public static final String MONDAY = "周一";public static final String TUESDAY = "周二";public static final String WEDNESDAY = "周三";public static final String THURSDAY = "周四";public static final String FRIDAY = "周五";public static final String SATURDAY = "周六";public static final String SUNDAY = "周日";private Context context;private String date;// 日期字符串 日期格式:yyyy-MM-ddprivate int MAXday;// 日期月份一共有多少天private int TopMAXday;// 日期月份上一个月一共有多少天private int ItemCount = 42;// GridView Item个数private ArrayList<String> lastDates;// 当前日期月份之前一个月private ArrayList<String> contenDates;// 当前日期月份private ArrayList<String> nextDates;// 当前日期月份之后一个月/*** @param date* 当传递过来的date为null时 则使用当前时间* @param remindDate* 所需要提醒的时间集合* */public DateGridViewAdapter(Context context, String date) {this.context = context;if (date == null) {this.date = Utils.getDate();} else if (Utils.isValidDate(date)) {this.date = date;}initialization();}/*** 初始化日期数据*/private void initialization() {MAXday = Utils.getDayOfMonth(getDate());TopMAXday = Utils.getTopDayOfMonth(getDate());setData(); }/*** 设置日期数据*/private void setData() {contenDates = new ArrayList<>();nextDates = new ArrayList<>();lastDates = new ArrayList<>();switch (Utils.getWeek(this.date)) {case MONDAY: // 周一addData(lastDates, TopMAXday, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 1);break;case TUESDAY: // 周二addData(lastDates, TopMAXday - 1, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 2);break;case WEDNESDAY:// 周三addData(lastDates, TopMAXday - 2, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 3);break;case THURSDAY:// 周四addData(lastDates, TopMAXday - 3, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 4);break;case FRIDAY:// 周五addData(lastDates, TopMAXday - 4, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 5);break;case SATURDAY:// 周六addData(lastDates, TopMAXday - 5, TopMAXday);addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday - 6);break;case SUNDAY:// 周日addData(contenDates, MAXday);addData(nextDates, ItemCount - MAXday);break;}}private void addData(ArrayList<String> list, int i, int count) {for (int j = i; j <= count; j++) {list.add(j + "");}}private void addData(ArrayList<String> list, int count) {for (int i = 1; i <= count; i++) {list.add(i + "");}}@Overridepublic int getCount() {return contenDates.size() + nextDates.size() + lastDates.size();}@Overridepublic Object getItem(int position) {if (lastDates.size() != 0 && position < lastDates.size()) {return lastDates.get(position);} else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) {return nextDates.get(position);} else {return contenDates.get(position);}}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView tv = null;if (convertView == null) {AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,Utils.dip2px(context, 40));tv = new TextView(context);tv.setLayoutParams(lp);convertView = tv;} else {tv = (TextView) convertView;} // 上一个月if (lastDates.size() != 0 && position < lastDates.size()) {tv.setTextColor(Color.parseColor("#bfbfbf"));tv.setText(lastDates.get(position));}// 下一个月else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) { tv.setText(nextDates.get(position - lastDates.size() - contenDates.size()));tv.setTextColor(Color.parseColor("#bfbfbf"));}// 当月else {tv.setText(contenDates.get(position - lastDates.size()));tv.setTextColor(Color.parseColor("#000000"));}return tv;}
}
Utils 源码:
public class Utils {public static final int TYPR_NEXT = 0;// 下一个月public static final int TYPR_LAST = 1;// 上一个月/*** 根据手机的分辨率从 px(像素) 的单位 转成为 dp*/public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}/*** 根据手机的分辨率从 dp(像素) 的单位 转成为 px*/public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** @param date* 日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期月份的1号是星期几?*/public static String getWeek(String date) {Calendar calendar = Calendar.getInstance(Locale.CHINA);calendar.setTime(new Date(getMillisecond(date)));calendar.set(Calendar.DAY_OF_MONTH, 1);SimpleDateFormat format = new SimpleDateFormat("E");return format.format(calendar.getTime());}/*** @return 返回系统当前时间的日期字符串 "年-月-日"*/public static String getDate() {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");return df.format(new Date());}/*** @param date* 根据传入日期字符串 date 传入的日期字符串格式 :"年-月-日"* * @param type* {@link #TYPR_LAST }上一个月* <p>* {@link #TYPR_NEXT}下一个月* * @return 返回下一月或上一个月的日期字符串*/public static String getNewDate(String date, int type) {String formatDate = getDate(getMillisecond(date));String year = formatDate.substring(0, 4);String day = formatDate.substring(8, formatDate.length());String month = formatDate.substring(5, 7);int intYear = Integer.valueOf(year);int intMonth = Integer.valueOf(month);month = "";if (type == TYPR_LAST) {if (intMonth > 1) {month = String.valueOf((intMonth - 1));} else {year = "";month = "12";year = String.valueOf((intYear - 1));}} else {if (intMonth == 12) {year = "";month = "1";year = String.valueOf((intYear + 1));} else {month = String.valueOf((intMonth + 1));}}String NewDate = year + "-" + month + "-" + day;return getDate(getMillisecond(NewDate));}/*** @param date* 日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期上一个月 月份的最大天数** */public static int getTopDayOfMonth(String date) {String NewDate = getNewDate(date, TYPR_LAST);return getDayOfMonth(NewDate);}/*** @param date* 日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期月份的最大天数*/public static int getDayOfMonth(String date) {Calendar aCalendar = Calendar.getInstance(Locale.CHINA);aCalendar.setTime(new Date(getMillisecond(date)));int day = aCalendar.getActualMaximum(Calendar.DATE);return day;}/*** @param date* 日期字符串 传入的日期字符串格式 :"年-月-日"* @return 返回日期的毫秒值*/public static long getMillisecond(String date) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date d = null;try {d = sdf.parse(date);} catch (ParseException e) {e.printStackTrace();}return d.getTime();}/*** @param millisecond* 毫秒值* @return 返回一个日期格式为 yyyy-MM-dd 的字符串 "年-月-日"*/public static String getDate(Long millisecond) {DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");Calendar calendar = Calendar.getInstance();calendar.setTimeInMillis(millisecond);return formatter.format(calendar.getTime());}/*** @param date* 判断日期格式是否是 yyyy-MM-dd "年-月-日"* @return 如果不是则返回 fase*/public static boolean isValidDate(String date) {boolean convertSuccess = true;SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");try {// 设置lenient为false.// 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01format.setLenient(false);format.parse(date);} catch (ParseException e) {// e.printStackTrace();// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对convertSuccess = false;}return convertSuccess;}}
到此初始效果已经实现了 .....................
Aandroid日历Dialog相关推荐
- android系统日期对话框只显示年月,android 只显示年月的日历
这是一篇不完整的文章 希望看到的读者 能够 跟我完善一下 ! 这系统自带的日历 多多少少 会有弊端 ! 手机版本不一样 操作不一样 所以我们在判断隐藏某一部分之前 还要判断api的版本 这是我要达成的 ...
- 精心挑选12款优秀的 JavaScript 日历和时间选择插件
今天这篇文章向大家分享12款精心挑选的优秀 JavaScript 日历和时间选择插件,都带有详细的使用教程和效果演示.这些插件能够帮助 Web 开发人员更快速的实现各种精美的日历和时间选择效果.同时推 ...
- python对话框机制_Chromium 新的弹窗机制以及 HTML 的 dialog 元素
自 1995 年 JavaScript 诞生之初,就包含了 3 个方法 alert().confirm() 和 prompt().在随后的 Chrome 版本中,Chrome 团队一直在修改原生弹窗的 ...
- 日历控件的android代码,Android日历控件PickTime代码实例
Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...
- jQuery插件实战之fullcalendar(日历插件)Demo
jQuery的插件许多,应用的场景也很丰富,今天我这里给大家介绍一款很有用的日历页面开发插件 - fullcalendar,眼下最新版本号是1.5.1,使用这款插件可以高速帮助你高速编程实现基于web ...
- flutter 日历_Flutter:一个更贴近真实项目的练习
最近 Flutter 火的一塌糊涂,所以今天给大家推荐一个 Flutter 的练习项目.非常的适合入门级学习 Flutter 的开发者. 为什么这么说呢?因为它包含了完整 UI 设计图,更贴近真实项目 ...
- 12款优秀的 JavaScript 日历和时间选择控件
这些插件能够帮助 Web 开发人员更快速的实现各种精美的日历和时间选择效果. 1. The Coolest Calendar 界面非常漂亮的一款日期选择插件,有详细的使用文档,最新版本 1.5. 点 ...
- html 日历系统 源码,calendar.html
Full Calendar - Bootstrap后台管理系统模版Ace下载 try{ace.settings.check('navbar' , 'fixed')}catch(e){} Ace Adm ...
- 选择时间日历控件DatePickerDialog实现(从外包项目中挖出来整理的)
直接上源码 Mainactivity.java package cn.xiayiye.canclder;import java.util.Calendar;import android.app.Act ...
最新文章
- 用 C# 做组件设计时的事件实现方法讨论
- monitor.go
- 基于springboot2.5.5自建启动器starter制品库
- LeetCode 923. 三数之和的多种可能(双指针)
- Chrome浏览器安装vue-devtools插件
- 网络编程之 字节序和深入理解bind()函数
- vue中使用base64和md5
- 算法导论第22章部分答案
- Layui表单验证lay-verify属性:自定义校验
- Android应用源码之仿墨迹天气插件
- 计算机关机界面卡住,Win7关机缓慢,关机后一直卡在正在关机界面
- android 桌面快捷方式静态shortcuts异常
- 详解变频器、逆变器工作原理
- 等效焦距和视场角计算
- Microsoft Exchange Server邮箱管理
- Linux 流量控制工具 TC 详解
- 计算几何基础——【点积和叉积的用处】
- 用非上市股权评估的思路看Polkadot估值
- 解决FTP文件访问需要输入用户名和密码的问题
- 个人以及企业用户如何选择合适的阿里云服务器?