From 773b1b97fc0f01efc8cf1e17a1250a9b654b1b85 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Fri, 20 Aug 2010 15:45:24 -0700 Subject: [PATCH] Make ActionBar menus handle configuration changes gracefully. Change-Id: I2c9ca846143b313ef9d2a01dff81385e0693518d --- .../internal/view/menu/ActionMenuView.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java index cb5f17980d990..b84789fc40c65 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuView.java @@ -56,18 +56,34 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo com.android.internal.R.styleable.Theme_actionButtonPadding, 0); mItemMargin = mItemPadding / 2; a.recycle(); - + + // Measure for initial configuration + mMaxItems = measureMaxActionButtons(); + + // TODO There has to be a better way to indicate that we don't have a hard menu key. + final int screen = getResources().getConfiguration().screenLayout; + mReserveOverflow = (screen & Configuration.SCREENLAYOUT_SIZE_MASK) == + Configuration.SCREENLAYOUT_SIZE_XLARGE; + } + + public void onConfigurationChanged(Configuration newConfig) { + final int screen = newConfig.screenLayout; + mReserveOverflow = (screen & Configuration.SCREENLAYOUT_SIZE_MASK) == + Configuration.SCREENLAYOUT_SIZE_XLARGE; + mMaxItems = measureMaxActionButtons(); + if (mMenu != null) { + mMenu.setMaxActionItems(mMaxItems); + updateChildren(false); + } + } + + private int measureMaxActionButtons() { final Resources res = getResources(); final int size = res.getDimensionPixelSize(com.android.internal.R.dimen.action_icon_size); final int spaceAvailable = res.getDisplayMetrics().widthPixels / 2; final int itemSpace = size + mItemPadding; - mMaxItems = spaceAvailable / (itemSpace > 0 ? itemSpace : 1); - - // TODO There has to be a better way to indicate that we don't have a hard menu key. - final int screen = res.getConfiguration().screenLayout; - mReserveOverflow = (screen & Configuration.SCREENLAYOUT_SIZE_MASK) == - Configuration.SCREENLAYOUT_SIZE_XLARGE; + return spaceAvailable / (itemSpace > 0 ? itemSpace : 1); } public boolean isOverflowReserved() {