日历开发渐进教程(2)
来源:互联网 发布:java调用js 编辑:程序博客网 时间:2024/04/29 15:22
上一篇完成了对布局的开发,那么现在就要做到怎么把这些布局联系起来,成为一个可视的UI。
STEP2:完成日历显示和滑动切换
图中是需要在src文件目录下新建的包和文件,activity里放的是活动,也就是最终展示我们日历界面的地方。adapter中是viewPager的适配器,其作用类似ListView的ArrayAdapter。Fragment中是提供给adapter的元素,每次滑动都要去刷新Fragmet。
先上代码
MainActivity.java
public class MainActivity extends FragmentActivity {private ViewPager mPager;private PagerAdapter mPagerAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取ViewPager布局mPager = (ViewPager) findViewById(R.id.pager);/* * 加载viewPager界面,显示日历 */mPagerAdapter = new CalendarPagerAdapter(getSupportFragmentManager());mPager.setAdapter(mPagerAdapter);}}
MainActivity很简单,就是加载根布局,然后获取ViewPager,在建立CalendarPagerAdapter实例,加载到mPager上。是不是很像ListView
CalendarPagerAdapter.javapublic class CalendarPagerAdapter extends FragmentStatePagerAdapter {//由于Fragment有两种不同的类 可以引入,为了避免冲突,统一选用android.support.v4.app.Fragment。public CalendarPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int monthIndex) {// 返回一个fragement实例。return new CalendarPagerFragment(monthIndex);}@Overridepublic int getCount() {// 返回viewpager的总页数,这里设定从2000-2100年return (2100-2000)*12;}}
new CalendarPagerAdapter(getSupportFragmentManager());会调用getItem方法根据当前的页面编号即monthIndex新建一个Fragment。getCount()返回2000-2100年所有也页面数。
CalendarPagerFragment.javapublic class CalendarPagerFragment extends Fragment {private int monthIndex;private int year;private int month;private Calendar date;private int offset;public CalendarPagerFragment(int monthIndex) {this.monthIndex = monthIndex;}public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {TableRow tableRow;View cellView;TableLayout tableView = (TableLayout) inflater.inflate(R.layout.view_pager_fragment, container, false);for (int row = 0; row < 6; row++) {//新建一个tableRow相当于在布局上画出一行tableRow = new TableRow(tableView.getContext());for (int column = 0; column < 7; column++) {//获取每天的布局,并且添加到tableRow中,这里相当于在那一行添加了7列dayCell。cellView = getView(row*7 + column, inflater, tableRow);tableRow.addView(cellView);}//每一行tableRow都加入tableViewtableView.addView(tableRow);}return tableView;}/** * 获取每个dayCell的布局内容 * @param position * @param inflater * @param container * @return */private View getView(int position, LayoutInflater inflater, ViewGroup container) {//由当前显示的month页的位置,计算现在是哪年,哪月。year = 2000 + (monthIndex/12);month = monthIndex % 12;//设定日期到当前x年x月1号的日期,这里为什么用生成公历的方法创建date,因为date.add()在Calendar类中是抽象方法, //不能直接用,而在GreGorianCalendar中被重写了date = new GregorianCalendar(year, month, 1);//计算x年x月1号是周几,由于每个月份页都是以周日开始,因此offset相当于算出了x年x月1号在月份的第一行偏离左边缘的位置。offset = 1 - date.get(Calendar.DAY_OF_WEEK);//date.add()通过position和偏离,算出循环到的日期date.add(Calendar.DAY_OF_MONTH, (offset+position));ViewGroup rootView;rootView = (ViewGroup) inflater.inflate(R.layout.day_cell, container, false);TextView txtDayCell = (TextView) rootView.findViewById(R.id.dayCell);txtDayCell.setText(String.valueOf(date.get(Calendar.DAY_OF_MONTH)));//将这个dayCell的日期信息保存起来,以便点击事件时利用rootView.setTag(date);return rootView;}}这是新建Fragment 的代码,也是这三个代码中比较复杂的一个,因为涉及到动态加载每天的布局day_cell.xml。注释中已经比较清楚的写明了代码的作用。
需要注意的几点:
1.如果中文显示不正常,去eclipse-file-properties-Text file encoding设置编码格式为UTF-8
2.这里Fragment导入类统一使用android.support.v4.app这个兼容包下得Fragment。因为在3.0版本后有两种Fragment工具类,如果两者都有会冲突的。
3.这里边的内容涉及有inflate加载布局、viewGroup、Calendar类、viewPager的详细用法等等,我不做过多介绍,大家可以去详查,毕竟只是教授如何实现。
4.一定注意活动要在AndroidManifest.xml中注册。其实你不注意也没关系,反正运行不了,你查看日志,就能知道原因了。
好了,经过了(1)(2)两个部分,你可以把程序运行到手机上了,能够看到(1)中我放的那张图的样子。这样日历的一个简单基本框架就完成。然而我们并不止步于此,想想新功能,添加进去。
- 日历开发渐进教程(2)
- 日历开发渐进教程(1)
- 日历开发渐进教程(3)
- 日历开发渐进教程(4)
- 日历开发渐进教程(5)
- Android 日历开发教程[一]
- Android 日历开发教程[二]
- Android 日历开发教程[三]
- Android 日历开发教程[四]
- Android 日历开发教程[五]
- Android 日历开发教程[六]
- WinPcap编程渐进教程(2)
- JSP渐进教程(1)
- WinPcap编程渐进教程
- android 开发教程之日历项目实践
- WinPcap编程渐进教程(中文)
- linux系统学习渐进教程
- WinPcap编程渐进教程1
- jackson json字符串、map、java对象的转换例子
- 【Android单元测试系列】真正的异步单元测试
- IOS菜鸟的所感所思(十四)——解析专辑获得专辑中的歌曲以及图片的优化
- 软件开发过程中的测试管理
- AS2.0鼠标跟随和拖动代码
- 日历开发渐进教程(2)
- java正则表达式的使用
- 【转】iOS 面试题
- bcm 驱动分析
- ajax核心技术1---XMLHttpRequset对象的使用
- 通过I/O方式模拟串口接收
- cocospods 卡在 Analyzing dependencies
- 浏览器渲染一个页面都干了哪些事
- IEEE trans模板格式中的分栏及左下角作者信息脚注的添加方法(Word 2010)