Skip to content

Commit 11aa4cc

Browse files
Jean-Baptiste Queruandroid code review
authored andcommitted
Merge "Set width of spinner's dropdown to fit on device"
2 parents 9303919 + 9514849 commit 11aa4cc

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

core/java/android/widget/Spinner.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import android.graphics.Rect;
2727
import android.graphics.drawable.Drawable;
2828
import android.util.AttributeSet;
29+
import android.util.DisplayMetrics;
2930
import android.view.Gravity;
3031
import android.view.View;
3132
import android.view.ViewGroup;
@@ -38,21 +39,21 @@
3839
*
3940
* <p>See the <a href="{@docRoot}resources/tutorials/views/hello-spinner.html">Spinner
4041
* tutorial</a>.</p>
41-
*
42+
*
4243
* @attr ref android.R.styleable#Spinner_prompt
4344
*/
4445
@Widget
4546
public class Spinner extends AbsSpinner implements OnClickListener {
4647
private static final String TAG = "Spinner";
47-
48+
4849
// Only measure this many items to get a decent max width.
4950
private static final int MAX_ITEMS_MEASURED = 15;
5051

5152
/**
5253
* Use a dialog window for selecting spinner options.
5354
*/
5455
public static final int MODE_DIALOG = 0;
55-
56+
5657
/**
5758
* Use a dropdown anchored to the Spinner for selecting spinner options.
5859
*/
@@ -732,26 +733,37 @@ public void setPromptText(CharSequence hintText) {
732733

733734
@Override
734735
public void show() {
736+
final Drawable background = getBackground();
737+
int bgOffset = 0;
738+
if (background != null) {
739+
background.getPadding(mTempRect);
740+
bgOffset = -mTempRect.left;
741+
} else {
742+
mTempRect.left = mTempRect.right = 0;
743+
}
744+
735745
final int spinnerPaddingLeft = Spinner.this.getPaddingLeft();
736746
if (mDropDownWidth == WRAP_CONTENT) {
737747
final int spinnerWidth = Spinner.this.getWidth();
738748
final int spinnerPaddingRight = Spinner.this.getPaddingRight();
749+
750+
int contentWidth = measureContentWidth(
751+
(SpinnerAdapter) mAdapter, getBackground());
752+
final int contentWidthLimit = mContext.getResources()
753+
.getDisplayMetrics().widthPixels - mTempRect.left - mTempRect.right;
754+
if (contentWidth > contentWidthLimit) {
755+
contentWidth = contentWidthLimit;
756+
}
757+
739758
setContentWidth(Math.max(
740-
measureContentWidth((SpinnerAdapter) mAdapter, getBackground()),
741-
spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight));
759+
contentWidth, spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight));
742760
} else if (mDropDownWidth == MATCH_PARENT) {
743761
final int spinnerWidth = Spinner.this.getWidth();
744762
final int spinnerPaddingRight = Spinner.this.getPaddingRight();
745763
setContentWidth(spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight);
746764
} else {
747765
setContentWidth(mDropDownWidth);
748766
}
749-
final Drawable background = getBackground();
750-
int bgOffset = 0;
751-
if (background != null) {
752-
background.getPadding(mTempRect);
753-
bgOffset = -mTempRect.left;
754-
}
755767
setHorizontalOffset(bgOffset + spinnerPaddingLeft);
756768
setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
757769
super.show();

0 commit comments

Comments
 (0)