日历开发渐进教程(4)

来源:互联网 发布:淘宝一淘与淘宝的关系 编辑:程序博客网 时间:2024/05/16 05:38

完成了第三篇的功能,运行完了看效果。发现不能高亮显示今天,这看起来总是不太舒服。如果你滑动翻了很多界面之后,想直接回到今天的界面,又不太方便。

好,那现在就来完成:

1.高亮显示今天 

2.直接回到今天

STEP5:高亮显示今天

还记得每天的布局是动态加载的吗,那么高亮显示必然在动态加载布局的文件中,也就是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 = new TableRow(tableView.getContext());for (int column = 0; column < 7; column++) {cellView = getView(row*7 + column, inflater, tableRow);cellView.setOnFocusChangeListener((View.OnFocusChangeListener)container.getContext());tableRow.addView(cellView);}tableView.addView(tableRow);}return tableView;}private View getView(int position, LayoutInflater inflater, ViewGroup container) {year = 2000 + (monthIndex/12);month = monthIndex % 12;date = new GregorianCalendar(year, month, 1);offset = 1 - date.get(Calendar.DAY_OF_WEEK);date.add(Calendar.DAY_OF_MONTH, (offset+position));ViewGroup rootView;rootView = (ViewGroup) inflater.inflate(R.layout.day_index_cell, container, false);TextView txtDayCell = (TextView) rootView.findViewById(R.id.txtDayCell);txtDayCell.setText(String.valueOf(date.get(Calendar.DAY_OF_MONTH)));/* * 如果是今天,就给改天设置背景shape_calendar_cell_today */if (isToday(date)){rootView.setBackgroundResource(R.drawable.shape_calendar_cell_today);}rootView.setTag(date);return rootView;}/** * 用于判断当前日期是不是今天 * @param date * @return */private Boolean isToday(Calendar date) {Calendar today = Calendar.getInstance();if ((date.get(Calendar.YEAR) == today.get(Calendar.YEAR))&& (date.get(Calendar.MONTH) == today.get(Calendar.MONTH))&& (date.get(Calendar.DAY_OF_MONTH) == today.get(Calendar.DAY_OF_MONTH))) {return true;}return false;}}
其实就添加了一个方法,判断当前日期是不是今天。然后在getView()中加入语句,如果是今天就添加背景

STEP6:直接回到今天

首先要在activit_main中加入一个ImageView控件,用来显示回到今天

               android:text="demo_week" />       </LinearLayout>                         <ImageView               android:id="@+id/backToday"               android:layout_width="wrap_content"               android:layout_height="wrap_content"               android:layout_gravity="right"               android:clickable="true"               android:onClick="onBackToday"               android:src="@drawable/back_today1" />     </FrameLayout>

这里不贴全部代码了,只贴一部分,大家应该可以看出来放到哪了。back_today1是那张图片,自己可以随便找一张,是.png就行。google在gitHub上有一个开源你的图片库,大家可以去搜一下https://github.com/google/material-design-icons。

在这里设置了图片属性可以点击,然后设置了监听函数onBackToday。那我们现在啊要做的就是去写onBackToday的逻辑。

在MianActivity.java中

public class MainActivity extends FragmentActivity {private ViewPager mPager;private PagerAdapter mPagerAdapter;//显示日期的抬头private TextView titleDate;private TextView titleWeek;//定义一个Calendar类型的变量,为今天private Calendar today;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取两个TextView控件titleDate = (TextView) findViewById(R.id.titleDate);titleWeek = (TextView) findViewById(R.id.titleWeek);//获取ViewPager布局mPager = (ViewPager) findViewById(R.id.pager);/* * 加载viewPager界面,显示日历 */mPagerAdapter = new CalendarPagerAdapter(getSupportFragmentManager());mPager.setAdapter(mPagerAdapter);//设置滑动页面监听mPager.setOnPageChangeListener(new simplePageChangeListener());//将显示页面直接定位到今天mPager.setCurrentItem(getTodayMonthIndex());}/** *页面滑动时执行的方法 */private class simplePageChangeListener extends ViewPager.SimpleOnPageChangeListener {@Overridepublic void onPageSelected(int monthIndex) {changeTitle(monthIndex, today);}}/** * 计算今天所在月份的页面编号 * @return */private int getTodayMonthIndex() {today = Calendar.getInstance();int offset = (today.get(Calendar.YEAR) - 2000)*12+today.get(Calendar.MONTH);return offset;}/** * 点击图片回到今天 * @param v */public void onBackToday(View v){switch(v.getId()){case R.id.backToday :mPager.setCurrentItem(getTodayMonthIndex());}}/** * 改变date和week抬头 */private void changeTitle(int position, Calendar date) {StringBuilder title = new StringBuilder();int year = 2000 + (position/12); title.append(year);title.append("-");int month = (position % 12) + 1;title.append(month);title.append("-");int day_num = date.get(Calendar.DAY_OF_MONTH);title.append(day_num);titleDate.setText(title);/* * 显示第几周,这里为了好看,加了一个退格符 */Calendar this_day = new GregorianCalendar(year, month-1, day_num);titleWeek.setText(""+String.valueOf(this_day.get(Calendar.WEEK_OF_YEAR))+"周");}}

只添加了一个方法,onBackToday(),好了。

将程序运行到手机上,无论你翻到哪一页都能点击“今”回到现在。




0 0
原创粉丝点击