summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2011-11-02 10:13:17 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-11-02 10:13:17 -0700
commit7f0c850b7a4a2b8a135a110a33d053f4d6689559 (patch)
treeb6f34e9af381cc68b926e6de279161a69fd18b5c
parentf9d8faf7fe9d23bddf4d8d039805bce806e9b9c6 (diff)
parentec1e06a00d26a783fb948e739ad8157c03e55302 (diff)
downloadframeworks_base-7f0c850b7a4a2b8a135a110a33d053f4d6689559.zip
frameworks_base-7f0c850b7a4a2b8a135a110a33d053f4d6689559.tar.gz
frameworks_base-7f0c850b7a4a2b8a135a110a33d053f4d6689559.tar.bz2
Merge "Updating NumberPicker, TimePicker, DatePicker to fit different screen and font sizes." into ics-mr1
-rw-r--r--core/java/android/widget/NumberPicker.java172
-rw-r--r--core/res/res/layout-sw600dp/date_picker_dialog.xml2
-rw-r--r--core/res/res/layout-sw600dp/number_picker.xml39
-rw-r--r--core/res/res/layout/date_picker.xml6
-rw-r--r--core/res/res/layout/date_picker_holo.xml23
-rw-r--r--core/res/res/layout/time_picker_holo.xml18
-rwxr-xr-xcore/res/res/values/attrs.xml6
-rw-r--r--core/res/res/values/styles.xml6
8 files changed, 151 insertions, 121 deletions
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 320c650..5ab99dc 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -203,6 +203,11 @@ public class NumberPicker extends LinearLayout {
private final EditText mInputText;
/**
+ * The min height of this widget.
+ */
+ private final int mMinHeight;
+
+ /**
* The max height of this widget.
*/
private final int mMaxHeight;
@@ -210,7 +215,17 @@ public class NumberPicker extends LinearLayout {
/**
* The max width of this widget.
*/
- private final int mMaxWidth;
+ private final int mMinWidth;
+
+ /**
+ * The max width of this widget.
+ */
+ private int mMaxWidth;
+
+ /**
+ * Flag whether to compute the max width.
+ */
+ private final boolean mComputeMaxWidth;
/**
* The height of the text.
@@ -527,8 +542,19 @@ public class NumberPicker extends LinearLayout {
getResources().getDisplayMetrics());
mSelectionDividerHeight = attributesArray.getDimensionPixelSize(
R.styleable.NumberPicker_selectionDividerHeight, defSelectionDividerHeight);
- mMaxHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxHeight, 0);
- mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxWidth, 0);
+ mMinHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_minHeight, 0);
+ mMaxHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxHeight,
+ Integer.MAX_VALUE);
+ if (mMinHeight > mMaxHeight) {
+ throw new IllegalArgumentException("minHeight > maxHeight");
+ }
+ mMinWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_minWidth, 0);
+ mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxWidth,
+ Integer.MAX_VALUE);
+ if (mMinWidth > mMaxWidth) {
+ throw new IllegalArgumentException("minWidth > maxWidth");
+ }
+ mComputeMaxWidth = (mMaxWidth == Integer.MAX_VALUE);
attributesArray.recycle();
mShowInputControlsAnimimationDuration = getResources().getInteger(
@@ -677,37 +703,33 @@ public class NumberPicker extends LinearLayout {
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- if (mMaxHeight <= 0 && mMaxWidth <= 0) {
- super.onLayout(changed, left, top, right, bottom);
- } else {
- final int msrdWdth = getMeasuredWidth();
- final int msrdHght = getMeasuredHeight();
-
- // Increment button at the top.
- final int inctBtnMsrdWdth = mIncrementButton.getMeasuredWidth();
- final int incrBtnLeft = (msrdWdth - inctBtnMsrdWdth) / 2;
- final int incrBtnTop = 0;
- final int incrBtnRight = incrBtnLeft + inctBtnMsrdWdth;
- final int incrBtnBottom = incrBtnTop + mIncrementButton.getMeasuredHeight();
- mIncrementButton.layout(incrBtnLeft, incrBtnTop, incrBtnRight, incrBtnBottom);
-
- // Input text centered horizontally.
- final int inptTxtMsrdWdth = mInputText.getMeasuredWidth();
- final int inptTxtMsrdHght = mInputText.getMeasuredHeight();
- final int inptTxtLeft = (msrdWdth - inptTxtMsrdWdth) / 2;
- final int inptTxtTop = (msrdHght - inptTxtMsrdHght) / 2;
- final int inptTxtRight = inptTxtLeft + inptTxtMsrdWdth;
- final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght;
- mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom);
-
- // Decrement button at the top.
- final int decrBtnMsrdWdth = mIncrementButton.getMeasuredWidth();
- final int decrBtnLeft = (msrdWdth - decrBtnMsrdWdth) / 2;
- final int decrBtnTop = msrdHght - mDecrementButton.getMeasuredHeight();
- final int decrBtnRight = decrBtnLeft + decrBtnMsrdWdth;
- final int decrBtnBottom = msrdHght;
- mDecrementButton.layout(decrBtnLeft, decrBtnTop, decrBtnRight, decrBtnBottom);
- }
+ final int msrdWdth = getMeasuredWidth();
+ final int msrdHght = getMeasuredHeight();
+
+ // Increment button at the top.
+ final int inctBtnMsrdWdth = mIncrementButton.getMeasuredWidth();
+ final int incrBtnLeft = (msrdWdth - inctBtnMsrdWdth) / 2;
+ final int incrBtnTop = 0;
+ final int incrBtnRight = incrBtnLeft + inctBtnMsrdWdth;
+ final int incrBtnBottom = incrBtnTop + mIncrementButton.getMeasuredHeight();
+ mIncrementButton.layout(incrBtnLeft, incrBtnTop, incrBtnRight, incrBtnBottom);
+
+ // Input text centered horizontally.
+ final int inptTxtMsrdWdth = mInputText.getMeasuredWidth();
+ final int inptTxtMsrdHght = mInputText.getMeasuredHeight();
+ final int inptTxtLeft = (msrdWdth - inptTxtMsrdWdth) / 2;
+ final int inptTxtTop = (msrdHght - inptTxtMsrdHght) / 2;
+ final int inptTxtRight = inptTxtLeft + inptTxtMsrdWdth;
+ final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght;
+ mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom);
+
+ // Decrement button at the top.
+ final int decrBtnMsrdWdth = mIncrementButton.getMeasuredWidth();
+ final int decrBtnLeft = (msrdWdth - decrBtnMsrdWdth) / 2;
+ final int decrBtnTop = msrdHght - mDecrementButton.getMeasuredHeight();
+ final int decrBtnRight = decrBtnLeft + decrBtnMsrdWdth;
+ final int decrBtnBottom = msrdHght;
+ mDecrementButton.layout(decrBtnLeft, decrBtnTop, decrBtnRight, decrBtnBottom);
if (!mScrollWheelAndFadingEdgesInitialized) {
mScrollWheelAndFadingEdgesInitialized = true;
@@ -719,20 +741,9 @@ public class NumberPicker extends LinearLayout {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- final int measuredWidth;
- if (mMaxWidth > 0) {
- measuredWidth = getMaxSize(widthMeasureSpec, mMaxWidth);
- } else {
- measuredWidth = getMeasuredWidth();
- }
- final int measuredHeight;
- if (mMaxHeight > 0) {
- measuredHeight = getMaxSize(heightMeasureSpec, mMaxHeight);
- } else {
- measuredHeight = getMeasuredHeight();
- }
- setMeasuredDimension(measuredWidth, measuredHeight);
+ final int newWidthMeasureSpec = makeMeasureSpec(widthMeasureSpec, mMinWidth, mMaxWidth);
+ final int newHeightMeasureSpec = makeMeasureSpec(heightMeasureSpec, mMinHeight, mMaxHeight);
+ super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec);
}
@Override
@@ -1034,6 +1045,49 @@ public class NumberPicker extends LinearLayout {
}
/**
+ * Computes the max width if no such specified as an attribute.
+ */
+ private void tryComputeMaxWidth() {
+ if (!mComputeMaxWidth) {
+ return;
+ }
+ int maxTextWidth = 0;
+ if (mDisplayedValues == null) {
+ float maxDigitWidth = 0;
+ for (int i = 0; i <= 9; i++) {
+ final float digitWidth = mSelectorWheelPaint.measureText(String.valueOf(i));
+ if (digitWidth > maxDigitWidth) {
+ maxDigitWidth = digitWidth;
+ }
+ }
+ int numberOfDigits = 0;
+ int current = mMaxValue;
+ while (current > 0) {
+ numberOfDigits++;
+ current = current / 10;
+ }
+ maxTextWidth = (int) (numberOfDigits * maxDigitWidth);
+ } else {
+ final int valueCount = mDisplayedValues.length;
+ for (int i = 0; i < valueCount; i++) {
+ final float textWidth = mSelectorWheelPaint.measureText(mDisplayedValues[i]);
+ if (textWidth > maxTextWidth) {
+ maxTextWidth = (int) textWidth;
+ }
+ }
+ }
+ maxTextWidth += mInputText.getPaddingLeft() + mInputText.getPaddingRight();
+ if (mMaxWidth != maxTextWidth) {
+ if (maxTextWidth > mMinWidth) {
+ mMaxWidth = maxTextWidth;
+ } else {
+ mMaxWidth = mMinWidth;
+ }
+ invalidate();
+ }
+ }
+
+ /**
* Gets whether the selector wheel wraps when reaching the min/max value.
*
* @return True if the selector wheel wraps.
@@ -1119,6 +1173,7 @@ public class NumberPicker extends LinearLayout {
setWrapSelectorWheel(wrapSelectorWheel);
initializeSelectorWheelIndices();
updateInputTextView();
+ tryComputeMaxWidth();
}
/**
@@ -1150,6 +1205,7 @@ public class NumberPicker extends LinearLayout {
setWrapSelectorWheel(wrapSelectorWheel);
initializeSelectorWheelIndices();
updateInputTextView();
+ tryComputeMaxWidth();
}
/**
@@ -1298,24 +1354,28 @@ public class NumberPicker extends LinearLayout {
}
/**
- * Gets the max value for a size based on the measure spec passed by
- * the parent and the max value for that size.
+ * Makes a measure spec that tries greedily to use the max value.
*
* @param measureSpec The measure spec.
* @param maxValue The max value for the size.
- * @return The max size.
+ * @return A measure spec greedily imposing the max size.
*/
- private int getMaxSize(int measureSpec, int maxValue) {
+ private int makeMeasureSpec(int measureSpec, int minValue, int maxValue) {
+ final int size = MeasureSpec.getSize(measureSpec);
+ if (size < minValue) {
+ throw new IllegalArgumentException("Available space is less than min size: "
+ + size + " < " + minValue);
+ }
final int mode = MeasureSpec.getMode(measureSpec);
switch (mode) {
case MeasureSpec.EXACTLY:
- return MeasureSpec.getSize(measureSpec);
+ return measureSpec;
case MeasureSpec.AT_MOST:
- return Math.min(MeasureSpec.getSize(measureSpec), maxValue);
+ return MeasureSpec.makeMeasureSpec(Math.min(size, maxValue), MeasureSpec.EXACTLY);
case MeasureSpec.UNSPECIFIED:
- return maxValue;
+ return MeasureSpec.makeMeasureSpec(maxValue, MeasureSpec.EXACTLY);
default:
- throw new IllegalArgumentException();
+ throw new IllegalArgumentException("Unknown measure mode: " + mode);
}
}
diff --git a/core/res/res/layout-sw600dp/date_picker_dialog.xml b/core/res/res/layout-sw600dp/date_picker_dialog.xml
index 004d52a..f9b247f 100644
--- a/core/res/res/layout-sw600dp/date_picker_dialog.xml
+++ b/core/res/res/layout-sw600dp/date_picker_dialog.xml
@@ -22,4 +22,6 @@
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:spinnersShown="true"
+ android:calendarViewShown="true"
/>
diff --git a/core/res/res/layout-sw600dp/number_picker.xml b/core/res/res/layout-sw600dp/number_picker.xml
deleted file mode 100644
index 807daf2..0000000
--- a/core/res/res/layout-sw600dp/number_picker.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <ImageButton android:id="@+id/increment"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- style="?android:attr/numberPickerUpButtonStyle"
- android:contentDescription="@string/number_picker_increment_button" />
-
- <EditText android:id="@+id/numberpicker_input"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- style="?android:attr/numberPickerInputTextStyle" />
-
- <ImageButton android:id="@+id/decrement"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- style="?android:attr/numberPickerDownButtonStyle"
- android:contentDescription="@string/number_picker_decrement_button" />
-
-</merge>
diff --git a/core/res/res/layout/date_picker.xml b/core/res/res/layout/date_picker.xml
index 1649466..6f0517d 100644
--- a/core/res/res/layout/date_picker.xml
+++ b/core/res/res/layout/date_picker.xml
@@ -40,7 +40,7 @@
<!-- Month -->
<NumberPicker
android:id="@+id/month"
- android:layout_width="80dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
@@ -51,7 +51,7 @@
<!-- Day -->
<NumberPicker
android:id="@+id/day"
- android:layout_width="80dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
@@ -62,7 +62,7 @@
<!-- Year -->
<NumberPicker
android:id="@+id/year"
- android:layout_width="95dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
diff --git a/core/res/res/layout/date_picker_holo.xml b/core/res/res/layout/date_picker_holo.xml
index 8627637..57b5614 100644
--- a/core/res/res/layout/date_picker_holo.xml
+++ b/core/res/res/layout/date_picker_holo.xml
@@ -23,8 +23,8 @@
depending on the date format selected by the user.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal"
android:gravity="center">
@@ -32,7 +32,6 @@
<LinearLayout android:id="@+id/pickers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginRight="22dip"
android:layout_weight="1"
android:orientation="horizontal"
android:gravity="center">
@@ -40,10 +39,10 @@
<!-- Month -->
<NumberPicker
android:id="@+id/month"
- android:layout_width="48dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="22dip"
- android:layout_marginRight="22dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -51,10 +50,10 @@
<!-- Day -->
<NumberPicker
android:id="@+id/day"
- android:layout_width="48dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="22dip"
- android:layout_marginRight="22dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -62,10 +61,10 @@
<!-- Year -->
<NumberPicker
android:id="@+id/year"
- android:layout_width="48dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="22dip"
- android:layout_marginRight="22dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
diff --git a/core/res/res/layout/time_picker_holo.xml b/core/res/res/layout/time_picker_holo.xml
index ca6fe2d..29c97b7 100644
--- a/core/res/res/layout/time_picker_holo.xml
+++ b/core/res/res/layout/time_picker_holo.xml
@@ -28,10 +28,10 @@
<!-- hour -->
<NumberPicker
android:id="@+id/hour"
- android:layout_width="48dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="22dip"
- android:layout_marginRight="20dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="14dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -47,10 +47,10 @@
<!-- minute -->
<NumberPicker
android:id="@+id/minute"
- android:layout_width="48dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="22dip"
+ android:layout_marginLeft="14dip"
+ android:layout_marginRight="16dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -58,10 +58,10 @@
<!-- AM / PM -->
<NumberPicker
android:id="@+id/amPm"
- android:layout_width="48dip"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="22dip"
- android:layout_marginRight="22dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 936482d..a40e24c 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3576,8 +3576,14 @@
<attr name="selectionDivider" format="reference" />
<!-- @hide The height of the selection divider. -->
<attr name="selectionDividerHeight" format="dimension" />
+ <!-- @hide The min height of the NumberPicker. -->
+ <attr name="minHeight" />
<!-- @hide The max height of the NumberPicker. -->
<attr name="maxHeight" />
+ <!-- @hide The min width of the NumberPicker. -->
+ <attr name="minWidth" />
+ <!-- @hide The max width of the NumberPicker. -->
+ <attr name="maxWidth" />
<!-- @hide The max width of the NumberPicker. -->
<attr name="maxWidth" />
</declare-styleable>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 8356985..8d95d86 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -1654,8 +1654,8 @@ please see styles_device_defaults.xml.
<item name="android:flingable">true</item>
<item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item>
<item name="android:selectionDividerHeight">2dip</item>
- <item name="android:maxHeight">180dip</item>
- <item name="android:maxWidth">56dip</item>
+ <item name="android:minWidth">48dip</item>
+ <item name="android:maxHeight">200dip</item>
</style>
<style name="Widget.Holo.TimePicker" parent="Widget.TimePicker">
@@ -1684,6 +1684,8 @@ please see styles_device_defaults.xml.
<style name="Widget.Holo.EditText.NumberPickerInputText">
<item name="android:paddingTop">13sp</item>
<item name="android:paddingBottom">13sp</item>
+ <item name="android:paddingLeft">2sp</item>
+ <item name="android:paddingRight">2sp</item>
<item name="android:gravity">center</item>
<item name="android:singleLine">true</item>
<item name="android:textSize">18sp</item>