diff --git a/core/java/com/android/internal/view/menu/ActionMenuItemView.java b/core/java/com/android/internal/view/menu/ActionMenuItemView.java index a10d241ef4e4b..d5c2018d2b3a4 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuItemView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuItemView.java @@ -27,28 +27,26 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.accessibility.AccessibilityEvent; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.LinearLayout; +import android.widget.TextView; import android.widget.Toast; /** * @hide */ -public class ActionMenuItemView extends LinearLayout +public class ActionMenuItemView extends TextView implements MenuView.ItemView, View.OnClickListener, View.OnLongClickListener, ActionMenuView.ActionMenuChildView { private static final String TAG = "ActionMenuItemView"; private MenuItemImpl mItemData; private CharSequence mTitle; + private Drawable mIcon; private MenuBuilder.ItemInvoker mItemInvoker; - private ImageButton mImageButton; - private Button mTextButton; private boolean mAllowTextWithIcon; private boolean mExpandedFormat; private int mMinWidth; + private int mSavedPaddingLeft; public ActionMenuItemView(Context context) { this(context, null); @@ -68,17 +66,12 @@ public class ActionMenuItemView extends LinearLayout mMinWidth = a.getDimensionPixelSize( com.android.internal.R.styleable.ActionMenuItemView_minWidth, 0); a.recycle(); - } - @Override - public void onFinishInflate() { - mImageButton = (ImageButton) findViewById(com.android.internal.R.id.imageButton); - mTextButton = (Button) findViewById(com.android.internal.R.id.textButton); - mImageButton.setOnClickListener(this); - mTextButton.setOnClickListener(this); - mImageButton.setOnLongClickListener(this); setOnClickListener(this); setOnLongClickListener(this); + + // Save the inflated padding for later, we'll need it. + mSavedPaddingLeft = getPaddingLeft(); } public MenuItemImpl getItemData() { @@ -96,13 +89,6 @@ public class ActionMenuItemView extends LinearLayout setEnabled(itemData.isEnabled()); } - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - mImageButton.setEnabled(enabled); - mTextButton.setEnabled(enabled); - } - public void onClick(View v) { if (mItemInvoker != null) { mItemInvoker.invokeItem(mItemData); @@ -135,26 +121,22 @@ public class ActionMenuItemView extends LinearLayout } private void updateTextButtonVisibility() { - boolean visible = !TextUtils.isEmpty(mTextButton.getText()); - visible &= mImageButton.getDrawable() == null || + boolean visible = !TextUtils.isEmpty(mTitle); + visible &= mIcon == null || (mItemData.showsTextAsAction() && (mAllowTextWithIcon || mExpandedFormat)); - mTextButton.setVisibility(visible ? VISIBLE : GONE); + setText(visible ? mTitle : null); } public void setIcon(Drawable icon) { - mImageButton.setImageDrawable(icon); - if (icon != null) { - mImageButton.setVisibility(VISIBLE); - } else { - mImageButton.setVisibility(GONE); - } + mIcon = icon; + setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); updateTextButtonVisibility(); } public boolean hasText() { - return mTextButton.getVisibility() != GONE; + return !TextUtils.isEmpty(getText()); } public void setShortcut(boolean showShortcut, char shortcutKey) { @@ -164,8 +146,6 @@ public class ActionMenuItemView extends LinearLayout public void setTitle(CharSequence title) { mTitle = title; - mTextButton.setText(mTitle); - setContentDescription(mTitle); updateTextButtonVisibility(); } @@ -236,12 +216,17 @@ public class ActionMenuItemView extends LinearLayout @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final boolean textVisible = hasText(); + if (textVisible) { + setPadding(mSavedPaddingLeft, getPaddingTop(), getPaddingRight(), getPaddingBottom()); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int widthMode = MeasureSpec.getMode(widthMeasureSpec); - final int specSize = MeasureSpec.getSize(widthMeasureSpec); + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); final int oldMeasuredWidth = getMeasuredWidth(); - final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(specSize, mMinWidth) + final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(widthSize, mMinWidth) : mMinWidth; if (widthMode != MeasureSpec.EXACTLY && mMinWidth > 0 && oldMeasuredWidth < targetWidth) { @@ -249,5 +234,13 @@ public class ActionMenuItemView extends LinearLayout super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), heightMeasureSpec); } + + if (!textVisible && mIcon != null) { + // TextView won't center compound drawables in both dimensions without + // a little coercion. Pad in to center the icon after we've measured. + final int w = getMeasuredWidth(); + final int dw = mIcon.getIntrinsicWidth(); + setPadding((w - dw) / 2, getPaddingTop(), getPaddingRight(), getPaddingBottom()); + } } } diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java index 8d8c72c1d0706..e00fe9f7043ad 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuView.java @@ -96,6 +96,13 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo if (mFormatItems) { onMeasureExactFormat(widthMeasureSpec, heightMeasureSpec); } else { + // Previous measurement at exact format may have set margins - reset them. + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + lp.leftMargin = lp.rightMargin = 0; + } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } diff --git a/core/res/res/layout/action_menu_item_layout.xml b/core/res/res/layout/action_menu_item_layout.xml index dca6c52d21ef0..ba7cf3b54872d 100644 --- a/core/res/res/layout/action_menu_item_layout.xml +++ b/core/res/res/layout/action_menu_item_layout.xml @@ -18,39 +18,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:addStatesFromChildren="true" android:gravity="center" android:focusable="true" - android:paddingLeft="4dip" - android:paddingRight="4dip" - style="?android:attr/actionButtonStyle"> - -