Android如何自定义实现日历控件
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. Calendar类2. 布局创建calendar_layou
千家信息网最后更新 2026年11月03日Android如何自定义实现日历控件
这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
具体内容如下
1. Calendar类
2. 布局
创建calendar_layout.xml
创建item_layout.xml
在activity_main.xml中
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 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{ LayoutInflater layoutInflater; public CalendarAdapter(@NonNull Context context,ArrayList 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如何自定义实现日历控件"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
事件
月份
控件
日期
日历
方法
适配器
适配
相同
接口
内容
字体
篇文章
最大
三个
业务
个性
价值
位置
兴趣
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
新华互联网科技
北京路客互联网科技有限公司
高科技互联网
狮子座互联网科技
智慧科技互联网
广州凡科互联网科技
新浪科技互联网
卫星互联网科技股票
语蝶互联网科技有限公司
互联网科技与大数据专业
996高科技互联网公司
科技大学互联网
互联网数据科技专业
中国互联网有什么科技
宇信科技在杭州互联网排第几
易租星互联网科技有限公司
恒生科技指数 中概互联网
河南商务圈互联网科技有限公司
承德科技产业互联网平台
如何强化互联网金融科技
网络科技有限互联网
互联网科技金融
互联网科技公司电话
互联网未来科技
佰商互联网科技有限公司
互联网科技产业特征
互联网科技如何创业
扫呗互联网科技有限公司
广西泛欧互联网科技有限公司
青岛易易互联网科技