我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android如何自定义实现日历控件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android如何自定义实现日历控件

这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

具体内容如下

1. Calendar类

2. 布局

创建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">    <RelativeLayout        android:id="@+id/titleRl"        android:layout_width="match_parent"        android:layout_height="30dp">        <TextView            android:id="@+id/lastTv"            android:text="上一月"            android:layout_alignParentLeft="true"            android:gravity="center"            android:layout_width="wrap_content"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/monthTv"            android:text="十一月"            android:gravity="center"            android:layout_centerHorizontal="true"            android:layout_width="wrap_content"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/nextTv"            android:text="下一月"            android:gravity="center"            android:layout_alignParentRight="true"            android:layout_width="wrap_content"            android:layout_height="30dp"></TextView>    </RelativeLayout>    <LinearLayout        android:id="@+id/weekLl"        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <TextView            android:id="@+id/Tv7"            android:text="日"            android:gravity="center"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/Tv1"            android:text="一"            android:gravity="center"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/Tv2"            android:text="二"            android:gravity="center"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/Tv3"            android:text="三"            android:gravity="center"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/Tv4"            android:text="四"            android:gravity="center"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/Tv5"            android:text="五"            android:gravity="center"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="30dp"></TextView>        <TextView            android:id="@+id/Tv6"            android:text="六"            android:gravity="center"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="30dp"></TextView>    </LinearLayout>    <GridView        android: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">    <TextView        android: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.NewCalendar        android: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() {            @Override            public void onClick(View v) {                calendar.add(Calendar.MONTH,+1);   //月份+1                renderCalendar();            }        });        //“上一个”点击事件        lastTv.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                calendar.add(Calendar.MONTH,-1);   //月份-1                renderCalendar();            }        });    }    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        @Override        public 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() {            @Override            public 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实现长按事件接口    @Override    public void onItemClick(Date date) {        DateFormat df= SimpleDateFormat.getDateInstance();        Toast.makeText(this,df.format(date),Toast.LENGTH_SHORT).show();    }

Android如何自定义实现日历控件

以上是“Android如何自定义实现日历控件”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android如何自定义实现日历控件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android如何自定义实现日历控件

这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. Calendar类2. 布局创建calendar_layout.xml
2023-06-25

Android自定义日历控件实例详解

为什么要自定义控件 有时,原生控件不能满足我们对于外观和功能的需求,这时候可以自定义控件来定制外观或功能;有时,原生控件可以通过复杂的编码实现想要的功能,这时候可以自定义控件来提高代码的可复用性。 如何自定义控件 下面我通过我在github
2022-06-06

Android实现自定义日历

自定义日历控件,支持旧历、节气、日期标注、点击操作 (参考网络上的日历控件改写) 注:将下面的四张资源图片拷贝到所建包的下一个image目录中,如Calendar.java 所在包为 cc.util.android.view,则需要再创建一
2022-06-06

Android使用GridLayout绘制自定义日历控件

效果图思路:就是先设置Gridlayout的行列数,然后往里面放置一定数目的自定义日历按钮控件,最后实现日历逻辑就可以了。 步骤: 第一步:自定义日历控件(初步) 第二步:实现自定义单个日期按钮控件 第三步:将第二步得到的控件动态添加到第一
2022-06-06

Android自定义日历Calender代码实现

产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历自定义控件相信做android都知道:(1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的属性等的,在attrs文件夹中 (3)然后就
2022-06-06

Android如何自定义view实现日历打卡签到

这篇文章主要介绍Android如何自定义view实现日历打卡签到,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备
2023-06-14

android自定义view之实现日历界面实例

现在网上有很多自定义view实现日历的demo,今天讲一讲如何自己实现这个自定义view。 看一下最终效果图:在这个自定义view中,我使用了各种奇技淫巧的方法来实现这个日历,真是费尽心思。废话少说,开始进坑。 界面分析 头部是一个text
2022-06-06

WPF自定义控件如何实现

今天小编给大家分享一下WPF自定义控件如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方式一:基于现有控件进行扩展,如
2023-07-05

Android如何实现一个倒计时自定义控件

这篇“Android如何实现一个倒计时自定义控件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android如何实现一个倒计
2023-06-29

android自定义控件如何实现简易时间轴

这篇“android自定义控件如何实现简易时间轴”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“android自定义控件如何实现简易时间轴”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过
2023-06-28

Android如何自定义评分控件

今天小编给大家分享一下Android如何自定义评分控件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。自定义参数为了方便扩展,
2023-06-30

Android自定义控件实现手势密码

Android手势解锁密码效果图 首先呢想写这个手势密码的想法呢,完全是凭空而来的,然后笔者就花了一天时间弄出来了。本以为这个东西很简单,实际上手的时候发现,还有很多逻辑需要处理,稍不注意就容易乱套。写个UI效果图大约只花了3个小
2022-06-06

Android自定义控件实现时钟效果

在学习安卓群英传自定义控件章节的时候,有一个例子是绘制时钟,在实现了书上的例子后就想看这个时钟能不能动起来。 这里选择延迟一秒发送消息重绘view来实现的动画,对外提供了开启时钟,关闭时钟的方法,当activity执行onResume方法的
2022-06-06

Android如何自定义View歌词控件

本篇内容介绍了“Android如何自定义View歌词控件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言一、 歌词解析1.歌词实体类L
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录