日历开发渐进教程(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.java

public 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.java

public 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)中我放的那张图的样子。这样日历的一个简单基本框架就完成。然而我们并不止步于此,想想新功能,添加进去。




0 0