/** * * This method determines which menu items get to be 'action items' that will appear in an * action bar and which items should be 'overflow items' in a secondary menu. The rules are as * follows: * * <p>Items are considered for inclusion in the order specified within the menu. There is a limit * of mMaxActionItems as a total count, optionally including the overflow menu button itself. This * is a soft limit; if an item shares a group ID with an item previously included as an action * item, the new item will stay with its group and become an action item itself even if it breaks * the max item count limit. This is done to limit the conceptual complexity of the items * presented within an action bar. Only a few unrelated concepts should be presented to the user * in this space, and groups are treated as a single concept. * * <p>There is also a hard limit of consumed measurable space: mActionWidthLimit. This limit may * be broken by a single item that exceeds the remaining space, but no further items may be added. * If an item that is part of a group cannot fit within the remaining measured width, the entire * group will be demoted to overflow. This is done to ensure room for navigation and other * affordances in the action bar as well as reduce general UI clutter. * * <p>The space freed by demoting a full group cannot be consumed by future menu items. Once items * begin to overflow, all future items become overflow items as well. This is to avoid inadvertent * reordering that may break the app's intended design. */ public void flagActionItems() { if (!mIsActionItemsStale) { return; } // Presenters flag action items as needed. boolean flagged = false; for (WeakReference<MenuPresenter> ref : mPresenters) { final MenuPresenter presenter = ref.get(); if (presenter == null) { mPresenters.remove(ref); } else { flagged |= presenter.flagActionItems(); } } if (flagged) { mActionItems.clear(); mNonActionItems.clear(); ArrayList<MenuItemImpl> visibleItems = getVisibleItems(); final int itemsSize = visibleItems.size(); for (int i = 0; i < itemsSize; i++) { MenuItemImpl item = visibleItems.get(i); if (item.isActionButton()) { mActionItems.add(item); } else { mNonActionItems.add(item); } } } else { // Nobody flagged anything, everything is a non-action item. // (This happens during a first pass with no action-item presenters.) mActionItems.clear(); mNonActionItems.clear(); mNonActionItems.addAll(getVisibleItems()); } mIsActionItemsStale = false; }