diff options
| author | SeongJae Park <sj38.park@gmail.com> | 2012-02-29 01:56:43 +0900 |
|---|---|---|
| committer | SeongJae Park <sj38.park@gmail.com> | 2012-02-29 10:48:11 +0900 |
| commit | 95148495fc3d33e4ad4dcbdee83317422db94dbf (patch) | |
| tree | e2d208062aea2f3dda777a8e7f5157b422a71cf3 /core/java/android/widget/Spinner.java | |
| parent | d7fa7deef9bc0cf22bf450fdb062327697c087c4 (diff) | |
Set width of spinner's dropdown to fit on device
Commit for issue at
http://code.google.com/p/android/issues/detail?id=25916&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&start=100
[Problem]
Dropdown popup of Spinner become wider than device's width if selected
item's content's width is larger than device's screen.
[Cause]
Spinner just display dropdown popup with measured content's width
although measured content's width is wider than device's screen.
[Solution]
If calculated content's width is wider than device's screen, set width
of spinner's dropdown popup to fit on device.
Change-Id: I3276e5ff745c6ba1437c07fc55645d6b53fef89a
Signed-off-by: SeongJae Park <sj38.park@gmail.com>
Diffstat (limited to 'core/java/android/widget/Spinner.java')
| -rw-r--r-- | core/java/android/widget/Spinner.java | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java index ec3790ec2710..6499f9acfeba 100644 --- a/core/java/android/widget/Spinner.java +++ b/core/java/android/widget/Spinner.java @@ -26,6 +26,7 @@ import android.database.DataSetObserver; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -38,13 +39,13 @@ import android.view.ViewGroup; * * <p>See the <a href="{@docRoot}resources/tutorials/views/hello-spinner.html">Spinner * tutorial</a>.</p> - * + * * @attr ref android.R.styleable#Spinner_prompt */ @Widget public class Spinner extends AbsSpinner implements OnClickListener { private static final String TAG = "Spinner"; - + // Only measure this many items to get a decent max width. private static final int MAX_ITEMS_MEASURED = 15; @@ -52,7 +53,7 @@ public class Spinner extends AbsSpinner implements OnClickListener { * Use a dialog window for selecting spinner options. */ public static final int MODE_DIALOG = 0; - + /** * Use a dropdown anchored to the Spinner for selecting spinner options. */ @@ -732,13 +733,30 @@ public class Spinner extends AbsSpinner implements OnClickListener { @Override public void show() { + final Drawable background = getBackground(); + int bgOffset = 0; + if (background != null) { + background.getPadding(mTempRect); + bgOffset = -mTempRect.left; + } else { + mTempRect.left = mTempRect.right = 0; + } + final int spinnerPaddingLeft = Spinner.this.getPaddingLeft(); if (mDropDownWidth == WRAP_CONTENT) { final int spinnerWidth = Spinner.this.getWidth(); final int spinnerPaddingRight = Spinner.this.getPaddingRight(); + + int contentWidth = measureContentWidth( + (SpinnerAdapter) mAdapter, getBackground()); + final int contentWidthLimit = mContext.getResources() + .getDisplayMetrics().widthPixels - mTempRect.left - mTempRect.right; + if (contentWidth > contentWidthLimit) { + contentWidth = contentWidthLimit; + } + setContentWidth(Math.max( - measureContentWidth((SpinnerAdapter) mAdapter, getBackground()), - spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight)); + contentWidth, spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight)); } else if (mDropDownWidth == MATCH_PARENT) { final int spinnerWidth = Spinner.this.getWidth(); final int spinnerPaddingRight = Spinner.this.getPaddingRight(); @@ -746,12 +764,6 @@ public class Spinner extends AbsSpinner implements OnClickListener { } else { setContentWidth(mDropDownWidth); } - final Drawable background = getBackground(); - int bgOffset = 0; - if (background != null) { - background.getPadding(mTempRect); - bgOffset = -mTempRect.left; - } setHorizontalOffset(bgOffset + spinnerPaddingLeft); setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED); super.show(); |
