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是专门为了显示视图切换而定义的一个适配器类。

待续