Android日历控件

推荐一款第三方的日历框架------CalendarView Android上一个优雅、高度自定义、性能高效的日历控件,完美支持周视图,支持标记、自定义颜色、农历等,任意控制月视图显示、任意日期拦截条件、自定义周起始等。Canvas绘制,极速性能、占用内存低,支持简单定制即可实现任意自定义布局、自定义UI,支持收缩展开、性能非常高效, 这个控件内存和效率优势相当明显,而且真正做到收缩+展开,适配多种场景,支持同时多种颜色标记日历事务,支持多点触控,你真的想不到日历还可以如此优雅!继承自己的月视图和周视图,只需要依次实现onDrawText。 阅读详情

这个日历控件主要是在material-canendarview的基础上修改,符合自己的项目中。
主要针对上面问题
1、选择时间后,标题没有改变,但下面日历已经改变
2、滑动的时间错乱问题。

github上开源项目地址
https://github.com/prolificinteractive/material-calendarview

效果图:
这里写图片描述

选择年月

这里写图片描述

在开源项目中主要修改的类

这里写图片描述

注意:通CalendarView的月从0-11,如果用获取的话,month得加1

代码如下

package com.prolificinteractive.materialcalendarview.sample;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.bigkoo.pickerview.MyTimePickerView;
import com.bigkoo.pickerview.TimePickerView;
import com.prolificinteractive.materialcalendarview.CalendarDay;
import com.prolificinteractive.materialcalendarview.MaterialCalendarView;
import com.prolificinteractive.materialcalendarview.OnDateSelectedListener;
import com.prolificinteractive.materialcalendarview.OnMonthChangedListener;
import com.prolificinteractive.materialcalendarview.sample.decorators.BasicActivity2;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
 * Shows off the most basic usage
 */
public class BasicActivity extends AppCompatActivity implements OnDateSelectedListener, OnMonthChangedListener, View.OnClickListener {

    private static final DateFormat FORMATTER = SimpleDateFormat.getDateInstance();

    @Bind(R.id.calendarView)
    MaterialCalendarView widget;

//    @Bind(R.id.textView)
//    TextView textView;

//    @Bind(R.id.button)
//    TextView button;

    @Bind(R.id.button1)
    Button button1;
   // TextView button1;
    private MyTimePickerView timePickerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic);
        ButterKnife.bind(this);

        widget.setOnDateChangedListener(this);
        widget.state().edit()
                .setMaximumDate(CalendarDay.from(new Date()))
                .commit();
        widget.setOnMonthChangedListener(this);
        SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月");
        Date  date=new Date();
        sdf.format(date);
        button1.setText(sdf.format(date) + "");
        // widget.setsele
        widget.setSelectionMode(MaterialCalendarView.SELECTION_MODE_SINGLE);
        //Setup initial text
        // textView.setText(getSelectedDatesString());
        widget.setTopbarVisible(!widget.getTopbarVisible());
        timePickerView = new MyTimePickerView(BasicActivity.this);
        timePickerView.setTitle("");
        timePickerView.setCyclic(false);
        timePickerView.setCancelable(false);
        //  button.setOnClickListener(this);
        button1.setOnClickListener(this);

        timePickerView.setOnTimeSelectListener(new TimePickerView.OnTimeSelectListener() {
            @Override
            public void onTimeSelect(Date date) {
                Calendar c = Calendar.getInstance();
                c.setTime(date);
                int year = c.get(Calendar.YEAR);
                int month = c.get(Calendar.MONTH);
                Log.i("year-----", year + "");
                Log.i("month-----", month + "");
                Log.i("date-----", CalendarDay.from(year, month, 1) + "");

                widget.setCurrentDate(CalendarDay.from(year, month, 0), true);
                //   widget.setDateSelected(CalendarDay.from(year, month, 1), true);
                widget.setSelected(true);
                widget.setSelectedDate(CalendarDay.from(year, month, 0));
            }
        });

    }

    @Override
    protected void onResume() {
        super.onResume();
        widget.setSelectionMode(MaterialCalendarView.SELECTION_MODE_SINGLE);
    }

    @Override
    protected void onTitleChanged(CharSequence title, int color) {
        super.onTitleChanged(title, color);
    }


    @Override
    public void onDateSelected(@NonNull MaterialCalendarView widget, @Nullable CalendarDay date, boolean selected) {
        //  textView.setText(getSelectedDatesString());
       // button1.setText(getSelectedDatesString());
        button1.setText(date.getYear()+"年"+(date.getMonth()+1)+"月");
        widget.setSelectionColor(000000);
        widget.setSelectionMode(MaterialCalendarView.SELECTION_MODE_SINGLE);
        Intent intent = new Intent();
        intent.setClass(this, BasicActivity2.class);
        widget.setSelectionMode(MaterialCalendarView.SELECTION_MODE_NONE);
        startActivity(intent);
    }

    @Override
    public void onMonthChanged(MaterialCalendarView widget, CalendarDay date) {
        //noinspection ConstantConditions
        getSupportActionBar().setTitle(FORMATTER.format(date.getDate()));
    //    textView.setText(FORMATTER.format(date.getDate()));
        Log.i("getYear-----", date.getYear() + "");
        Log.i("getMonth-----", date.getMonth() + "");
        button1.setText(date.getYear()+"年"+(date.getMonth()+1)+"月");
    }

    private String getSelectedDatesString() {

        CalendarDay date = widget.getSelectedDate();
        if (date == null) {
            return "No Selection";
        }
        return FORMATTER.format(date.getDate());
    }

    @Override
    public void onClick(View v) {
        timePickerView.setTime(new Date());
        timePickerView.show();
    }
}

2、DatePicker

这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.mydatepicker.MainActivity">

    <Button
        android:text="选择时间"
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:hint=""
        android:id="@+id/ed_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>
package com.example.mydatepicker;

import android.app.DatePickerDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
    private Button btn;
    private Calendar calendar; //通过Calendar获取系统时间
    private int mYear;
    private int mMonth;
    private int mDay;
    private int mHour;
    private int mMinute;
    private EditText ed_text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn= (Button) findViewById(R.id.btn);
        calendar = Calendar.getInstance();
        ed_text= (EditText) findViewById(R.id.ed_text);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int day) {
                        // TODO Auto-generated method stub
                        mYear = year;
                        mMonth = month;
                        mDay = day;
                      //  更新EditText控件日期 小于10加0
                        ed_text.setText(year + "-" + (mMonth + 1) + "-" + mDay );
                    }
                }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                        calendar.get(Calendar.DAY_OF_MONTH) ).show();
            }
        });

    }
}

3、DatePicker取消问题

datepicker如果没有设置取消,点击空白时和点击返回按钮时,都也会把时间默认的选中。因此要设置取消按钮
这里写图片描述

   tv_startTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar cal = Calendar.getInstance();
                final DatePickerDialog mDialog = new DatePickerDialog(getActivity(), null,
                        cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));

                //手动设置按钮
                mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "完成", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //通过mDialog.getDatePicker()获得dialog上的DatePicker组件,然后可以获取日期信息
                        DatePicker datePicker = mDialog.getDatePicker();
                        int year = datePicker.getYear();
                        int month = datePicker.getMonth();
                        int day = datePicker.getDayOfMonth();
                        tv_startTime.setText(year + "-" + (month + 1) + "-" + day);
                    }
                });
                //取消按钮,如果不需要直接不设置即可
                mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                });

                mDialog.show();
            }
        });

代码下载地址:
http://download.youkuaiyun.com/detail/androidxiaogang/9683277

Android UI-自定义日历控件 我们知道,一个星期有七天,分别为星期日、星期一、星期二、星期三、星期四、星期五、星期六,这里有7列,一个月至少有28天,最多31天,所以至少应该有6行。publicstaticString[]weekName={“周日”,“周一”,“周二”,“周三”,“周四”,“周五”,“周六”};这里我们定于一个日历卡,每一个月代表一个日历卡,我们通过计算每个月的日期,然后根据计算出来的位置绘制我们的数字。@authorwuwenjie单元格的状态当前月日期,过去的月的日期,下个月的日期。 阅读详情

相关推荐

Android实现签到日历控件

前言最近在做公司的一个APP项目的时候,有一个需求是要做一个签到页面。笔者自己考虑了一下设计思路和算法,并且实现了一个可以签到的日历控件。其实思路很简单,难点就在日期的绘制上。废话不多说,进入正题吧。效果预览算法设计总体思路设计按照效果图中所示的绘制日历,把每一天当作一个处理对象,每一个处理对象都有一个行、列序号,只要能计算出相应的行列序号,那么绘制就不成问题了。列序号相对比较容易算出来,比如201

peceoqicka的专栏 1万+

Android之 日历单选多选控件

日历单选多选控件

qq_29848853的博客 2970

安卓自定义日历滑动的日历控件

安卓自定义日历滑动的日历控件标签(空格分隔): 安卓最近公司项目需要做这个需求,自己才疏学浅,总算能写出个大概来,遂在这里记录下来。分析先来分析一下: 首先,我们的需求是可以左右点击查看跳转到下一个月,中间的日历控件可以水平滚动选择日期,所以我们中间的日历控件用一个RecycleView来做,左右两位的为ImageVeiw。 LRCalendarView 总体流程: 编写LRCalendarVi

牛仔面包 3963

安卓:表示日期的控件

DatePicker是一种安卓平台上常用的控件,用于让用户选择日期。它通常以日历的形式显示,并允许用户通过滑动或点击来选择年、月和日。

A125679880的博客 8286

全面解析功能丰富Android日历控件

在当今移动应用大行其道的背景下,日历控件是一个非常常见的界面元素,无论是用于展示日程、提醒事件还是单纯作为时间选择的工具,它都扮演着不可或缺的角色。Android平台提供了丰富的日历控件,以供开发者方便地嵌入到自己的应用中。在深入了解如何优化界面设计和用户体验之前,让我们先来探究一下Android日历控件的基础。本章将从以下两个方面对Android日历控件进行介绍:自定义样式和功能是Android开发中经常遇到的需求,它能够为应用带来独特的界面和交互体验。

weixin_35696112的博客 1113

Android自定义日历控件 calendarViewDemo 实战教程

Android平台内置的日历控件为开发者提供了基本的日历视图功能,通过类和DatePicker对话框可以方便地让用户选择日期。这些控件是很多应用中不可或缺的组件,尤其是在需要日期选择功能的场景下。在开发Android应用程序时,我们经常需要用到日历控件来处理日期和时间。Android标准的库提供了诸如和DatePicker等控件,它们能够满足基本的需求。然而,在复杂的场景下,这些控件往往表现出以下局限性:样式限制。

weixin_29301059的博客 1514

Android 自定义日历控件

【代码】Android 自定义日历控件。

魑魅魍魉9527 2815

Cadence ADE实战:1GHz VCO相位噪声仿真全流程(附PSS/Pnoise避坑指南)

本文详细介绍了在Cadence ADE环境中对1GHz VCO进行相位噪声仿真的完整流程。重点剖析了PSS(周期性稳态分析)和Pnoise(周期性噪声分析)两大核心引擎的关键参数设置与避坑指南,帮助射频与模拟IC设计者准确评估VCO性能,解决仿真不收敛、结果异常等常见问题。

rock5的博客 669

探索高效日历控件:安卓日历 NCalendar

探索高效日历控件:安卓日历 NCalendar 项目地址:https://gitcode.com/gh_mirrors/nc/NCalendar 在移动应用开发中,日历控件是不可或缺的一部分,它为用户提供了直观的时间管理工具。今天,我们要介绍的是一款功能强大、高度可定制的安卓日历控件——NCalendar。这款开源项目不仅提供了丰富的功能,还支持多种自定义选项,满足不同应用场景的需求。 项目介绍 ...

gitblog_00299的博客 1113

MIT 18.03 微分方程 ODE 学习笔记分享——目录

从B站上看到了MIT 微分方程的课程,觉得老爷子讲的真好! 其实微分方程对于工科来说相当重要,但是很多学习也仅把他放在高数里作为单独的一个章节来讲,这是远远不够的。所以对于同学们来说 ,一定要认真听讲,做好笔记! 以下是我的个人学习比较分享。有需要的同学可以做一个参考。 注:个人认为笔记的作用是用来回想起课堂所讲的内容(细节),所以我的笔记风格为以老师讲课思路为准,板书为辅。建议刚开始听这门课的同...

weixin_40664094的博客 2627

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 665

Android日历控件方法,Android日历控件的实现方法

本文实例为大家分享了Android日历控件的实现代码,供大家参考,具体内容如下1、效果图:2、弹窗Dialog:SelectDateDialog:public class SelectDateDialog {private static final String TAG = "SelectDateDialog";private Dialog dialog;private TextView date...

weixin_36295010的博客 3722

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

在上一篇中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

sinat_33909696的博客 2465

Android考勤日历控件

工作这么久,第一次在优快云上写技术博客,望大家多多支持;      本篇博文给大家分享一个考勤日历控件,这里有个需求:要求显示当前月的日期,左右可以切换月份来查看日期。可以通过不同的颜色表示每天的考勤状态; 这里我自定义了一个日历控件,大家以后可以根据自己的需求来修改代码。首先大家来看一下效果图:              一、为了让大家可以尽快的使用改控件,我首先会从

shenyang2003112312的博客 1509

Spring AI 实战:第七章、Spring AI Advisor机制之记忆大师

从金鱼到最强大脑通过 Spring AI 的记忆功能,我们成功让 AI:记住了用户身份实现了多用户隔离做到了持久化存储最终效果用户:“和上次一样” → AI 秒懂用户:“你知道我的名字吗?” → AI:“当然,张三!AI的进化路线🐟金鱼脑 →🧠最强大脑 →🏛️记忆宫殿管理员。

liaokailin的专栏 1516

Linux系统安全学习手册

Linux反弹shell Linux系统应急响应 Linux服务器安全加固 Linux下的用户、组和权限 Linux中的gcc Linux中su和sudo的用法和区别 Linux系统python2与python3共存 Linux中grep工具的使用 Linux中环境变量的设置 Linux中常见的150个命令(干货) Linux中编写Shell脚本 LNMP环境搭建Wordpress博客 LAMP环境搭建一个Discuz论坛 Linux运维比较常用的一些脚本 Linux系统中安装软

谢公子的博客 7532

安卓Andriod使用入门(七)【Android日历控件】

明天的希望,让我们忘了今天的痛苦。MainActivity.java代码:package siso.timessquare;import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import

极客神殿 3072

AI硬件加速:CPU vs GPU性能对比

AI硬件加速:CPU vs GPU性能对比 关键词:人工智能、硬件加速、CPU、GPU、性能对比、硬件架构、并行计算、优化策略、项目实战 摘要: 本文将深入探讨AI

AI天才研究院 1913

Android开发之日历控件实现

Android开发之日历控件实现:以下都是转载的。 日历控件 日历控件 日历控件 日历控件

SharkArmy 67

YoloV8改进策略:轻量级的CloFormer助力Yolov8在速度和精度上实现双双提升

CloFormer是清华大学在今年发表的轻量级主干网络,引入了AttnConv,一种attention风格的卷积算子。所提出的AttnConv使用共享权重来聚合局部信息,并配置精心设计的上下文感知权重来增强局部特征。AttnConv和普通attention的结合使用池化来减少CloFormer中的FLOPs,使模型能够感知高频和低频信息。这篇文章主要向大家讲解如何将CloFormer加入到YoloV8中。论文链接:https://arxiv.org/abs/2303.17803v5。

m0_47867638的博客 4311

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android开发之日历控件

本文介绍Android平台上几种有用的的日历控件。日历控件在Web开发中有很多的解决方案,而且很容易实现,但是在Android平台上的解决方案较少且不容易实现。下面给大家开始介绍几种及我们实现的示例。     我们大家都知道,在Android平台3.0中才新增了日历视图控件,可以显示网格状的日历内容,那么对于Android 3.0以下的版本要使用日历控件只能借助第三方,目前用的最多的是Cale

周十一的技术博客 821

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 仿旅游日历控件_安卓分享—一款优雅的日历控件-Material Calendar View

因为项目中需要日历控件,作为一个懒惰的代码搬运工第一反应当然是去GitHub找,不过找到好看又好用的当然还是要拿出来和大家分享的,希望不要得到鄙视的目光。老规矩先上效果图。calendarView.gif作为一个简单的代码搬运工我的反应是这样的666.gif是这样的:6+++.gif需要直接下载demo并运行的同学请注意因为demo中gradle插件版本过低因此需要将build.gradle中的(...

weixin_42252435的博客 579

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 仿旅游日历控件_仿携程日历控件

仿携程日历控件RecycleView实现日历列表,其中每个itemView纯cavas绘制。github地址 欢迎 start Issues支持以下功能日历选中和不可选样式行间距以及颜色设置最大可以选择多少天悬停月份展示单选和范围选择Demo单选 image范围选择 image使用XML文件android:layout_width="match_parent"android:layou...

weixin_31083103的博客 634
上一篇: GreenDao的使用
下一篇: retrofit
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值