文章目录

  • 一、Calendar类
    • 1. 说明
    • 2. 使用
  • 二、自定义实现日历控件
    • 1. 布局
    • 3. 业务处理
    • 3. 定制UI
    • 4. 事件监听

一、Calendar类

1. 说明

Calendar是java util包下的一个工具类,提供了很方便的不同日期格式的处理。

定义 字段 说明
年份 Calendar.YEAR
月份 Calendar.MONTH
日期 Calendar.DATE
这一天在这个月的第几天 Calendar.DAY_OF_MONTH 同“DATE”
这一天是星期几 Calendar.DAY_OF_WEEK 可以为,SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY 和 SATURDAY。其中,SUNDAY为1,MONDAY为2,依次类推。
这一天所在的周是这个月的第几周 Calendar.DAY_OF_WEEK_IN_MONTH
这一天在这年的第几天 Calendar.DAY_OF_YEAR
一天中的第几小时 Calendar.HOUR 12小时制
一天中的第几小时 Calendar.HOUR_OF_DAY 24小时制
一小时中的第几分钟 Calendar.MINUTE
一分钟中的第几秒 Calendar.SECOND
一秒钟的第几毫秒 Calendar.MILLISECOND
这一周为一月中的第几周 Calendar.WEEK_OF_MONTH
这一周为一年中的第几周 Calendar.WEEK_OF_YEAR
纪元 Calendar.ERA 只能为0 或 1。0表示BC(“before Christ”,即公元前),1表示AD(拉丁语“Anno Domini”,即公元)。
毫秒为单位指示距 GMT 的大致偏移量 Calendar.ZONE_OFFSET

2. 使用

Calendar calendar=new GregorianCalendar();System.out.println("当前系统时间"+calendar.getTime());System.out.println("年份为"+calendar.get(Calendar.YEAR));System.out.println("月份为"+calendar.get(Calendar.MONTH));System.out.println("日期为"+calendar.get(Calendar.DATE));System.out.println("这一天在这个月的第几天"+calendar.get(Calendar.DAY_OF_MONTH));System.out.println("这一天在这周的第几天"+calendar.get(Calendar.DAY_OF_WEEK));System.out.println("这一天所在的周是这个月的第几周"+calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));System.out.println("这一天在这年的第几天"+calendar.get(Calendar.DAY_OF_YEAR));System.out.println("12小时制下当前时"+calendar.get(Calendar.HOUR));System.out.println("24小时制下当前时"+calendar.get(Calendar.HOUR_OF_DAY));System.out.println("分为"+calendar.get(Calendar.MINUTE));System.out.println("秒为"+calendar.get(Calendar.SECOND));System.out.println("毫秒为"+calendar.get(Calendar.MILLISECOND));System.out.println("这一周为一月中的第几周"+calendar.get(Calendar.WEEK_OF_MONTH));System.out.println("这一周为一年中的第几周"+calendar.get(Calendar.WEEK_OF_YEAR));System.out.println("纪元为"+calendar.get(Calendar.ERA));System.out.println("zone为"+calendar.get(Calendar.ZONE_OFFSET));

二、自定义实现日历控件

1. 布局

创建calendar_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:padding="20sp"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:id="@+id/titleRl"android:layout_width="match_parent"android:layout_height="30dp"><TextViewandroid:id="@+id/lastTv"android:text="上一月"android:layout_alignParentLeft="true"android:gravity="center"android:layout_width="wrap_content"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/monthTv"android:text="十一月"android:gravity="center"android:layout_centerHorizontal="true"android:layout_width="wrap_content"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/nextTv"android:text="下一月"android:gravity="center"android:layout_alignParentRight="true"android:layout_width="wrap_content"android:layout_height="30dp"></TextView></RelativeLayout><LinearLayoutandroid:id="@+id/weekLl"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/Tv7"android:text="日"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv1"android:text="一"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv2"android:text="二"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv3"android:text="三"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv4"android:text="四"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv5"android:text="五"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv6"android:text="六"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView></LinearLayout><GridViewandroid:id="@+id/calendarCv"android:numColumns="7"android:layout_width="match_parent"android:layout_height="match_parent"></GridView>
</LinearLayout>

创建item_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/itemTv"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"></TextView>
</LinearLayout>

在activity_main.xml中

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.aye.newcalendar.NewCalendarandroid:id="@+id/calendarNc"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"></com.aye.newcalendar.NewCalendar>
</androidx.constraintlayout.widget.ConstraintLayout>

3. 业务处理

创建NewCalendar类,继承LinearLayout

public class NewCalendar extends LinearLayout {private TextView lastTv,nextTv,dateTv;private GridView calendarGv;private Calendar calendar=Calendar.getInstance();  //日历控件初始化//重写三个构造方法public NewCalendar(Context context) {super(context);}public NewCalendar(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initControl(context);  //绑定控件}public NewCalendar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initControl(context);  //绑定控件}private void initControl(Context context){bindControl(context);  //绑定控件bindControlEvent();   //绑定控件事件}//绑定控件事件方法private void bindControlEvent() {renderCalendar();//“下一月”点击事件nextTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {calendar.add(Calendar.MONTH,+1);   //月份+1renderCalendar();}});//“上一个”点击事件lastTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {calendar.add(Calendar.MONTH,-1);   //月份-1renderCalendar();}});}private void renderCalendar() {SimpleDateFormat sdf = new SimpleDateFormat("MMM yyy");  //日期格式化dateTv.setText(sdf.format(calendar.getTime()));  //设置月份ArrayList<Date> cells = new ArrayList<>();Calendar calendar1 = (Calendar) calendar.clone();  //克隆日历对象calendar1.set(Calendar.DAY_OF_MONTH, 1);  //置于当月第一天;int prevDays = calendar1.get(Calendar.DAY_OF_WEEK) - 1;  //获取上个月最后一天是星期几calendar1.add(Calendar.DAY_OF_MONTH, -prevDays);  //第一天int maxCount = 6 * 7;  //设置每个月最大天数//循环存入集合中while (cells.size() < maxCount) {cells.add(calendar1.getTime());calendar1.add(Calendar.DAY_OF_MONTH, 1);  //日期+1}//设置适配器calendarGv.setAdapter(new CalendarAdapter(getContext(),cells));}//适配器private class CalendarAdapter extends ArrayAdapter<Date>{LayoutInflater layoutInflater;public CalendarAdapter(@NonNull Context context,ArrayList<Date> days) {super(context, R.layout.item_layout,days);layoutInflater=LayoutInflater.from(context);}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {Date date=getItem(position);ViewHolder viewHolder;if (convertView==null){  //初始化绑定convertView=layoutInflater.inflate(R.layout.item_layout,parent,false);viewHolder=new ViewHolder();viewHolder.itemTv=convertView.findViewById(R.id.itemTv);convertView.setTag(viewHolder);}viewHolder= (ViewHolder) convertView.getTag();int day=date.getDate();viewHolder.itemTv.setText(String.valueOf(day));  //赋值return convertView;}class ViewHolder{TextView itemTv;}}private void bindControl(Context context) {LayoutInflater inflater=LayoutInflater.from(context);inflater.inflate(R.layout.calendar_layout,this);lastTv=findViewById(R.id.lastTv);nextTv=findViewById(R.id.nextTv);dateTv=findViewById(R.id.dateTv);calendarGv=findViewById(R.id.calendarGv);}
}

3. 定制UI

在适配器getView()方法中,个性化日历界面

            Date now=new Date();Boolean isTheSameMonth=false;  //是否与当前月份相同//判断显示的日期月份与当前月份相同if (date.getMonth()==now.getMonth()) {  //月份相同isTheSameMonth = true;}//若显示的日期月份与当前月份相同,则设置字体颜色是黑色if (isTheSameMonth) {viewHolder.itemTv.setTextColor(Color.parseColor("#000000"));}//设置当前日期字体为红色if (now.getDate()==date.getDate()&&now.getMonth()==date.getMonth()&&now.getYear()==date.getYear()){viewHolder.itemTv.setTextColor(Color.parseColor("#ff0000"));}

4. 事件监听

在NewCalendar中,首先编写长按事件的接口,然后设置适配器点击事件

    //长按事件接口public interface NewCalendarListener{void onItemClick(Date date);}//适配器长按事件calendarGv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {if (listener==null){return false;}else {//获取长按的位置,传入onItemClick方法中listener.onItemClick((Date) parent.getItemAtPosition(position));return true;}}});

在MainActivity中,实现长按事件接口并重写方法,实现长按某个日期弹出Toast显示当前长按日期。

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);NewCalendar calendar=findViewById(R.id.calendarNc);calendar.listener=this;}//MainActivity实现长按事件接口@Overridepublic void onItemClick(Date date) {DateFormat df= SimpleDateFormat.getDateInstance();Toast.makeText(this,df.format(date),Toast.LENGTH_SHORT).show();}

Calendar类、自定义实现日历控件相关推荐

  1. android日历价格控件,Android 自定义价格日历控件

    介绍 上个星期项目有一个日历价格的需求,类似一个商品在不同的日期价格可能会不同,由于时间给得特别紧所以打算找个合适的开源项目进行修改.参考了网上大多数是通过继承view直接draw一个monthVie ...

  2. C# Winform 自定义 日程日历控件

    C# Winform 自定义 日程日历控件 下载地址: https://download.csdn.net/download/dilidida/33627515

  3. QML自定义的日历控件

    QML中提供了日历的控件Calendar,但该控件为QtQuick.Controls 1中提供的控件,因此只能使用QtQuick.Controls.Styles的方式对该控件进行设置,效果如图: 在Q ...

  4. java自定义日历控件_【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...

    可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多,但也还算将就吧. 但是看了的小伙伴就很心急了,说楼主上传到gitHub的东西有问题,楼主下载来看了看,基本都没问题吧,没弄好的小伙伴 ...

  5. 【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...

    可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多,但也还算将就吧. 没有看的小伙伴如果有兴趣的话可以去看看:http://www.cnblogs.com/liushilin/p/57 ...

  6. Android自定义View精品(CustomCalendar-定制日历控件)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 目录: 文章目录 1.分析 2.自定义属性 3.onMeasure() 4.onDraw() ①.绘制月份 ...

  7. 自定义日历控件,可以根据需求定制属于自己的日历

    自定义日历控件,可以根据需求定制属于自己的日历 效果图 最近笔者的朋友需要写一个关于考勤的日历,效果如下,但在网上找了半天都找不到合适的,于是乎就向笔者求助,笔者本来觉得在晚上随便找个日历demo,然 ...

  8. Android自定义日历控件,自带农历节假日,已经开源,即取即用~

    关注本人的更多博客:http://www.cnblogs.com/liushilin/ 该自定义日历控件已经开源:github地址 可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多, ...

  9. WPF Calendar 日历控件 样式自定义

    原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...

  10. Calendar 自定义日历控件

    CalendarView 介绍 代码地址:https://github.com/09xuanjian/CalendarView 这是一个日历控件,很多时候我们需要把一些信息通过时间戳的方式展示给用户. ...

最新文章

  1. 柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)...
  2. 23. 进程并发控制之Semaphore
  3. UGUI 中Dropdown控件的使用经验
  4. Codeforces Round #242 (Div. 2)C(找规律,异或运算)
  5. 学习笔记(08):MySQL数据库运维与管理-03-用户权限回收
  6. .Net程序猿玩转Android开发---(11)页面跳转
  7. 模板函数与模板参数自动推导
  8. 一个数根号3怎样用计算机计算,手机计算器怎样打出根号3
  9. 公网访问局域网家用nas
  10. python gpl_详细介绍 GPL 协议
  11. 字符串,列表,元组,及综合训练
  12. 广度优先搜索BFS-P3456 [POI2007]GRZ-Ridges and Valleys
  13. python与tensorflow实现人脸表情识别(基于CNN)
  14. 无线打印服务器怎么安装,【DDwifi打印服务器】Windows 7系统添加打印机步骤(离线安装打印机驱动)...
  15. zk4元年拆解_减配实锤!Kobe4 开箱+拆解:你凭什么叫Protro?
  16. EditText设置IME动作问题
  17. 转载:Lock锁机制的原理及与Synchronized的比较——源码解说
  18. Oracle em13c安装手册
  19. asp.net基础:网页中插入Skype链接标签
  20. Process的使用

热门文章

  1. dsp2812 pmsm foc之EVA初始化详解
  2. python项目简历内容包括哪些_python简历内容
  3. 晶体表面原子结构和一篇论文
  4. MIT 18.02 多变量微积分笔记总目录
  5. android定位和地图开发实例
  6. 软件工程 - 个人博客系统 - 概要设计与详细设计文档
  7. 微信电影影视小程序系统源码
  8. 使SplitContainer中某个Panel宽度、高度不变
  9. docker+fastfds搭建文件服务器
  10. JavaScript算术运算中前加加与后加加