工作这么久,第一次在CSDN上写技术博客,望大家多多支持;
本篇博文给大家分享一个考勤日历控件,这里有个需求:要求显示当前月的日期,左右可以切换月份来查看日期。可以通过不同的颜色表示每天的考勤状态; 这里我自定义了一个日历控件,大家以后可以根据自己的需求来修改代码。首先大家来看一下效果图:
一、为了让大家可以尽快的使用改控件,我首先会从如何调用该控件入手给大家讲解:
由于在效果上可以无限滑动,需要将我自定义的日历控件与ViewPager、Fragment控件配合使用,这样是得调用过程稍有复杂,请大家注意我的调用步骤:
1、将自定义DateViewN与DateWidgetDayCellN拷贝到自己的src下的包中,然后在将其使用到Fragment布局文件中,如下面代码,其中“com.selfview.calendar1“为我的src下的包目录,DateViewN为我自定义的柱状图View:
/.........................../ <com.selfview.calendar1.DateViewN android:id="@+id/dateview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> /.........................../
2、创建一个Fragment类,调用上面建立的布局文件,下面我将关键代码贴出,并加以解释:
(1)在这个类中,我们应重点关注create(int pageNumber)这个方法,在ViewPager的滑动过程中,可以用ViewPager的页面编号,通过这个方法生成我们所需的Fragment;
(2)mPageNumber = getArguments().getInt(ARG_PAGE);// 获取当前页面编号;
(3)dateViewN.setShowDate(mPageNumber);//设置当前页面对应的自定义日历控件中的日期;
(4)dateViewN.setEntities(dateEntities);// 将数据集合放入自定义日历控件中
public static final String ARG_PAGE = "page";// key值 private int mPageNumber;// 当前页码 private DateViewN dateViewN;// 日历控件 private String currentMonth;// 当前月 private ArrayList<DateEntity> dateEntities;// 考勤数据集合 /.........................../ public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); /.........................../ mPageNumber = getArguments().getInt(ARG_PAGE);// 获取当前页面编号 } /.........................../ // 创建ItemFragmentDate通过ViewPager的页面编号 public static Fragment create(int pageNumber) { ItemFragmentDate fragment = new ItemFragmentDate(); Bundle args = new Bundle(); args.putInt(ARG_PAGE, pageNumber); fragment.setArguments(args); return fragment; } public ItemFragmentDate() { } /.........................../ dateViewN = (DateViewN) rootView.findViewById(R.id.dateview);// 初始日历控件 dateViewN.setShowDate(mPageNumber);//设置当前页面对应的自定义日历控件中的日期 currentMonth = dateViewN.getDateEntity().year + "-" + getAddZero(dateViewN.getDateEntity().month + "");//获取当前页面对应的年月 getDateEntityToNet(currentMonth);//通过当前月向网络获取数据 /.........................../ dateViewN.setEntities(dateEntities);// 将数据集合放入自定义日历控件中
3、自定义ViewPager适配器:
其中我定义ViewPager的总页面为1000页,对我的考勤日历来说已经足够,大家使用时可根据自己的需求来定
public class CalendarAdapter extends FragmentStatePagerAdapter { private final int ALL_PAGE_NUM = DateViewN.PAER_NUM * 2;// 设置页面总数 public CalendarAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Override public Fragment getItem(int arg0) { return ItemFragmentDate.create(arg0);// 根据传入的页面当前页面编号生成ItemFragmentDate对象碎片 } @Override public int getCount() { // TODO Auto-generated method stub return ALL_PAGE_NUM; } }
4、配置主页面布局,也就是调用一个ViewPager:
/.........................../ <android.support.v4.view.ViewPager android:id="@+id/viewpager_calender" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_gravity="center" android:layout_weight="1" > </android.support.v4.view.ViewPager> /.........................../5、编写主页面代码:
/.........................../ private ViewPager viewpager_calender;// 左右滑动控件 private CalendarAdapter calendarAdapter;// ViewPager的适配器 private int startPageNum = DateViewN.PAER_NUM;// 将当前页面设置成第500个页面,往前可以滑动499次,499个月,对应考勤而言已经足够 /.........................../ viewpager_calender = (ViewPager) findViewById(R.id.viewpager_calender); calendarAdapter = new CalendarAdapter(getSupportFragmentManager()); viewpager_calender.setAdapter(calendarAdapter);// 设置ViewPager适配器 viewpager_calender.setCurrentItem(currentPageNum); /.........................../