Calendar类、自定义实现日历控件
文章目录
- 一、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类、自定义实现日历控件相关推荐
- android日历价格控件,Android 自定义价格日历控件
介绍 上个星期项目有一个日历价格的需求,类似一个商品在不同的日期价格可能会不同,由于时间给得特别紧所以打算找个合适的开源项目进行修改.参考了网上大多数是通过继承view直接draw一个monthVie ...
- C# Winform 自定义 日程日历控件
C# Winform 自定义 日程日历控件 下载地址: https://download.csdn.net/download/dilidida/33627515
- QML自定义的日历控件
QML中提供了日历的控件Calendar,但该控件为QtQuick.Controls 1中提供的控件,因此只能使用QtQuick.Controls.Styles的方式对该控件进行设置,效果如图: 在Q ...
- java自定义日历控件_【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...
可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多,但也还算将就吧. 但是看了的小伙伴就很心急了,说楼主上传到gitHub的东西有问题,楼主下载来看了看,基本都没问题吧,没弄好的小伙伴 ...
- 【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...
可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多,但也还算将就吧. 没有看的小伙伴如果有兴趣的话可以去看看:http://www.cnblogs.com/liushilin/p/57 ...
- Android自定义View精品(CustomCalendar-定制日历控件)
版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 目录: 文章目录 1.分析 2.自定义属性 3.onMeasure() 4.onDraw() ①.绘制月份 ...
- 自定义日历控件,可以根据需求定制属于自己的日历
自定义日历控件,可以根据需求定制属于自己的日历 效果图 最近笔者的朋友需要写一个关于考勤的日历,效果如下,但在网上找了半天都找不到合适的,于是乎就向笔者求助,笔者本来觉得在晚上随便找个日历demo,然 ...
- Android自定义日历控件,自带农历节假日,已经开源,即取即用~
关注本人的更多博客:http://www.cnblogs.com/liushilin/ 该自定义日历控件已经开源:github地址 可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多, ...
- WPF Calendar 日历控件 样式自定义
原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...
- Calendar 自定义日历控件
CalendarView 介绍 代码地址:https://github.com/09xuanjian/CalendarView 这是一个日历控件,很多时候我们需要把一些信息通过时间戳的方式展示给用户. ...
最新文章
- 柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)...
- 23. 进程并发控制之Semaphore
- UGUI 中Dropdown控件的使用经验
- Codeforces Round #242 (Div. 2)C(找规律,异或运算)
- 学习笔记(08):MySQL数据库运维与管理-03-用户权限回收
- .Net程序猿玩转Android开发---(11)页面跳转
- 模板函数与模板参数自动推导
- 一个数根号3怎样用计算机计算,手机计算器怎样打出根号3
- 公网访问局域网家用nas
- python gpl_详细介绍 GPL 协议
- 字符串,列表,元组,及综合训练
- 广度优先搜索BFS-P3456 [POI2007]GRZ-Ridges and Valleys
- python与tensorflow实现人脸表情识别(基于CNN)
- 无线打印服务器怎么安装,【DDwifi打印服务器】Windows 7系统添加打印机步骤(离线安装打印机驱动)...
- zk4元年拆解_减配实锤!Kobe4 开箱+拆解:你凭什么叫Protro?
- EditText设置IME动作问题
- 转载:Lock锁机制的原理及与Synchronized的比较——源码解说
- Oracle em13c安装手册
- asp.net基础:网页中插入Skype链接标签
- Process的使用