Fix NumberPicker.setWrapSelectorWheel(boolean) not respecting user choice
The issue states that NumberPicker.setWrapSelectorWheel(false) only works in a specific call order. The underlying problem is that NumberPicker does not remember user's preference on whether the selector wheel should be wrapped. Therefore, it only works when user sets their preference last, after everything else that could affect the choice gets executed. Bug: 19049714 Change-Id: Ic27d909cb3dd657993a4df9a04c819b6965ad11b
This commit is contained in:
@@ -148,6 +148,11 @@ public class NumberPicker extends LinearLayout {
|
||||
*/
|
||||
private static final int SIZE_UNSPECIFIED = -1;
|
||||
|
||||
/**
|
||||
* User choice on whether the selector wheel should be wrapped.
|
||||
*/
|
||||
private boolean mWrapSelectorWheelPreferred = true;
|
||||
|
||||
/**
|
||||
* Use a custom NumberPicker formatting callback to use two-digit minutes
|
||||
* strings like "01". Keeping a static formatter etc. is the most efficient
|
||||
@@ -1353,10 +1358,21 @@ public class NumberPicker extends LinearLayout {
|
||||
* @param wrapSelectorWheel Whether to wrap.
|
||||
*/
|
||||
public void setWrapSelectorWheel(boolean wrapSelectorWheel) {
|
||||
mWrapSelectorWheelPreferred = wrapSelectorWheel;
|
||||
updateWrapSelectorWheel();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the selector wheel should be wrapped is determined by user choice and whether
|
||||
* the choice is allowed. The former comes from {@link #setWrapSelectorWheel(boolean)}, the
|
||||
* latter is calculated based on min & max value set vs selector's visual length. Therefore,
|
||||
* this method should be called any time any of the 3 values (i.e. user choice, min and max
|
||||
* value) gets updated.
|
||||
*/
|
||||
private void updateWrapSelectorWheel() {
|
||||
final boolean wrappingAllowed = (mMaxValue - mMinValue) >= mSelectorIndices.length;
|
||||
if ((!wrapSelectorWheel || wrappingAllowed) && wrapSelectorWheel != mWrapSelectorWheel) {
|
||||
mWrapSelectorWheel = wrapSelectorWheel;
|
||||
}
|
||||
mWrapSelectorWheel = wrappingAllowed && mWrapSelectorWheelPreferred;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1412,8 +1428,7 @@ public class NumberPicker extends LinearLayout {
|
||||
if (mMinValue > mValue) {
|
||||
mValue = mMinValue;
|
||||
}
|
||||
boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
|
||||
setWrapSelectorWheel(wrapSelectorWheel);
|
||||
updateWrapSelectorWheel();
|
||||
initializeSelectorWheelIndices();
|
||||
updateInputTextView();
|
||||
tryComputeMaxWidth();
|
||||
@@ -1450,8 +1465,7 @@ public class NumberPicker extends LinearLayout {
|
||||
if (mMaxValue < mValue) {
|
||||
mValue = mMaxValue;
|
||||
}
|
||||
boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
|
||||
setWrapSelectorWheel(wrapSelectorWheel);
|
||||
updateWrapSelectorWheel();
|
||||
initializeSelectorWheelIndices();
|
||||
updateInputTextView();
|
||||
tryComputeMaxWidth();
|
||||
|
||||
Reference in New Issue
Block a user