Android日历移植小结

    最近的小项目中要使用日历控件选择日期,折腾了好久,几次尝试加入别人写的成品,但问题很多。一方面因为自己初学Android,对其机制不够了解,另一方面因为自己太懒,看不进别人的代码,不想做太大的改动,调不好又容易放弃。

    最开始使用Android自有的CalendarView控件,遇到的问题主要是日期往下或往上滑动后页面自动关闭了,不大理解;最严重的是只支持API 11以上的版本,在3.0一下的版本中直接崩溃。后来参照文章http://www.cnblogs.com/hanyonglu/archive/2012/03/26/2418178.html,采用推荐的第一种,也是使用最广泛的一种CalendarView个人水平有限,移植了好久才调通,但界面排版出现严重的问题,估计是dimens.xml一直有些问题,调不好。又相继试过好几个Demos后,都出现莫名其妙的问题,初学者的痛啊!

    刚才终于搞定了日历,采用的是那篇博文作者自己实现的日历MyCalendarDemo。简要说明下自己的移植流程:

    首先将原demo中的MainActivity类改名,不然可能和自己的文件重名,比如改为CalendarAcitivity,相关的地方都改一下,包括包中另外两个文件调用的位置,以及文件名和Manifest中的Activity注册。将整个包拷进自己的项目中,注意在Manifest中的注册路径也要改,加上位置“com.calendar.demo”。

    将其他相关文件拷贝到自己项目的对应资源目录中,包括next_month.png,previous_month.png,calendar_main.xml,main.xml,colors.xml以及几个string资源。注意更新一下R文件,搞不定就清理一下,导入自己的R文件目录。

    我的目的是在点击日历按钮或菜单后调出日历界面,在界面上点击某个日期后返回选择的日期,再关闭日历,所以要在源代码上做一些修改。描述如下:

    假定将原Demo的MainActivity改成了CalendarActivity,则要调用的时候在按钮或菜单响应中加入代码:

	Intent intent = new Intent(MainActivity.this, CalendarActivity.class);
	MainActivity.this.startActivityForResult(intent, 100);

    同时修改CalendarAcitivity中的点击日历日期后的响应函数DateWidgetDayCell.OnItemClick。改写为:

	// 点击日历,触发事件
	private DateWidgetDayCell.OnItemClick mOnDayCellClick = new DateWidgetDayCell.OnItemClick() {
		public void OnClick(DateWidgetDayCell item) {
			calSelected.setTimeInMillis(item.getDate().getTimeInMillis());
//			int day = GetNumFromDate(calSelected, startDate);
			//本项目暂时不使用数据记录,因而把这段注释了
//			if (calendar_Hashtable != null
//					&& calendar_Hashtable.containsKey(day)) {
//				arrange_text.setText(Calendar_Source.get(calendar_Hashtable
//						.get(day)));
//			} else {
//				arrange_text.setText("暂无数据记录");
//			}
			
			item.setSelected(true);
			
			int year = calSelected.get(Calendar.YEAR);
			int month = calSelected.get(Calendar.MONTH);
			int dayOfMonth = calSelected.get(Calendar.DAY_OF_MONTH);
			
        	Intent data = new Intent();
        	data.putExtra("year", year);
        	data.putExtra("month", month);
        	data.putExtra("day", dayOfMonth);
        	
        	setResult(20, data);
        	updateCalendar();
        	
        	CalendarDispActivity.this.finish();
		}
	};

    然后在自己的项目中需要接收日历选择日期返回响应的页面中重写方法onActivityResult:

	//获得从日历控件得到的日期
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(resultCode==20) {
			int year = data.getIntExtra("year", 0);
			int month = data.getIntExtra("month", 0);
			int day = data.getIntExtra("day", 0);
			Calendar dat = Calendar.getInstance();//获得当前时间,可能没必要
			dat.set(Calendar.YEAR, year);
			dat.set(Calendar.MONTH, month);
			dat.set(Calendar.DAY_OF_MONTH, day);

			Toast.makeText(MainActivity.this, ""+year+"年"+month+"月"+day+"日", Toast.LENGTH_SHORT).show();

		}
	};

    在这里就可以接收到日历控件传过来的日期。

    建议更改一下原作者Demo中日历翻页的两个按钮图片,太小了不容易按到,开始还以为是响应慢。

    本文没什么技术,只是对自己日历控件完成的一个小结。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值