Android 4.0日历(calendar)源码分析之AllInOneActivity
在 Android 4.0日历(calendar)源码分析之概览 一文中我们讲到了AllInOneActivity在日历中的重要作用,这篇文章我们将对其进行代码层面的解读。
日历中90%以上的交互事件其实都是发生在AllInOneActivity中(虽然具体处理不是在这里),我们先来看看都有哪些事件。
1.切换视图的spinner事件
2.actionbar上的跳转到今天的按钮事件。
3.menu菜单中的新建,刷新,搜索,设置等菜单事件。
这些事件都很容易找到相应的事件处理代码。下面分别来说明。
切换视图的spinner事件
切换视图的spinner事件:
只有在手机上才会显示切换视图的spinner,在平板上是用的选项卡(tab)的形式。下面的代码决定了到底是用tab还是spinner:
private void configureActionBar(int viewType) {
if (mIsTabletConfig) { //如果是平板
createTabs();
} else { //否则在手机上用ButtonsSpinner
createButtonsSpinner(viewType);
}
if (mIsMultipane) {
mActionBar.setDisplayOptions(
ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME);
} else {
mActionBar.setDisplayOptions(0);
}
}
createButtonsSpinner函数的实现是这样的,该函数也是在AllInOneActivity中,是一个私有方法。
private void createButtonsSpinner(int viewType) {
mActionBarMenuSpinnerAdapter = new CalendarViewAdapter(this, viewType);
mActionBar = getActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
mActionBar.setListNavigationCallbacks(mActionBarMenuSpinnerAdapter, this);
switch (viewType) {
case ViewType.AGENDA:
mActionBar.setSelectedNavigationItem(BUTTON_AGENDA_INDEX);
break;
case ViewType.DAY:
mActionBar.setSelectedNavigationItem(BUTTON_DAY_INDEX);
break;
case ViewType.WEEK:
mActionBar.setSelectedNavigationItem(BUTTON_WEEK_INDEX);
break;
case ViewType.MONTH:
mActionBar.setSelectedNavigationItem(BUTTON_MONTH_INDEX);
break;
default:
mActionBar.setSelectedNavigationItem(BUTTON_DAY_INDEX);
break;
}
}
CalendarViewAdapter是专门为了显示视图切换而定义的一个适配器类。
待续