diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java index 4eecd6458145f..aba6834fc5301 100644 --- a/core/java/android/widget/SearchView.java +++ b/core/java/android/widget/SearchView.java @@ -627,12 +627,33 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); - if ((widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY) && mMaxWidth > 0 - && width > mMaxWidth) { - super.onMeasure(MeasureSpec.makeMeasureSpec(mMaxWidth, widthMode), heightMeasureSpec); - } else { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); + switch (widthMode) { + case MeasureSpec.AT_MOST: + // If there is an upper limit, don't exceed maximum width (explicit or implicit) + if (mMaxWidth > 0) { + width = Math.min(mMaxWidth, width); + } else { + width = Math.min(getPreferredWidth(), width); + } + break; + case MeasureSpec.EXACTLY: + // If an exact width is specified, still don't exceed any specified maximum width + if (mMaxWidth > 0) { + width = Math.min(mMaxWidth, width); + } + break; + case MeasureSpec.UNSPECIFIED: + // Use maximum width, if specified, else preferred width + width = mMaxWidth > 0 ? mMaxWidth : getPreferredWidth(); + break; } + widthMode = MeasureSpec.EXACTLY; + super.onMeasure(MeasureSpec.makeMeasureSpec(width, widthMode), heightMeasureSpec); + } + + private int getPreferredWidth() { + return getContext().getResources() + .getDimensionPixelSize(R.dimen.search_view_preferred_width); } private void updateViewsVisibility(final boolean collapsed) { @@ -695,7 +716,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { // Should we show the close button? It is not shown if there's no focus, // field is not iconified by default and there is no text in it. final boolean showClose = hasText || (mIconifiedByDefault && !mExpandedInActionView); - mCloseButton.setVisibility(showClose ? VISIBLE : INVISIBLE); + mCloseButton.setVisibility(showClose ? VISIBLE : GONE); mCloseButton.getDrawable().setState(hasText ? ENABLED_STATE_SET : EMPTY_STATE_SET); } @@ -991,7 +1012,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { */ private void updateVoiceButton(boolean empty) { int visibility = GONE; - if (mVoiceButtonEnabled && !isIconified() && (empty || !mSubmitButtonEnabled)) { + if (mVoiceButtonEnabled && !isIconified() && empty) { visibility = VISIBLE; mSubmitButton.setVisibility(GONE); } diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml index 673c96c62364d..c81c716b04b63 100644 --- a/core/res/res/layout/search_bar.xml +++ b/core/res/res/layout/search_bar.xml @@ -38,7 +38,7 @@ @@ -51,9 +51,10 @@ diff --git a/core/res/res/layout/search_view.xml b/core/res/res/layout/search_view.xml index 03e870611f0fb..53f0cffdd730b 100644 --- a/core/res/res/layout/search_view.xml +++ b/core/res/res/layout/search_view.xml @@ -105,7 +105,7 @@ 160dip + + 320dip + 64dip @@ -155,12 +158,12 @@ 16dip - 6dip + 8dip - 6dip + 8dip - 48dip + 32dip