diff --git a/library/build.gradle b/library/build.gradle
index e3932f68..75b5809e 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -10,6 +10,7 @@ android {
versionName project.VERSION_NAME
versionCode Integer.parseInt(project.VERSION_CODE)
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ vectorDrawables.useSupportLibrary = true
}
buildTypes {
diff --git a/library/src/main/java/com/wdullaer/materialdatetimepicker/time/TimePickerDialog.java b/library/src/main/java/com/wdullaer/materialdatetimepicker/time/TimePickerDialog.java
index ba2786b9..e566958e 100644
--- a/library/src/main/java/com/wdullaer/materialdatetimepicker/time/TimePickerDialog.java
+++ b/library/src/main/java/com/wdullaer/materialdatetimepicker/time/TimePickerDialog.java
@@ -23,6 +23,7 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
+import android.graphics.Paint;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.ColorInt;
@@ -42,14 +43,20 @@
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.NumberPicker;
import android.widget.RelativeLayout;
import android.widget.TextView;
+import android.widget.TimePicker;
import com.wdullaer.materialdatetimepicker.HapticFeedbackController;
import com.wdullaer.materialdatetimepicker.R;
import com.wdullaer.materialdatetimepicker.Utils;
import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout.OnValueSelectedListener;
+import java.lang.reflect.Field;
import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Calendar;
@@ -65,7 +72,9 @@ public class TimePickerDialog extends AppCompatDialogFragment implements
public enum Version {
VERSION_1,
- VERSION_2
+ VERSION_2,
+ VERSION_3, //Spinner only
+ VERSION_4 // V2 + Spinner
}
private static final String KEY_INITIAL_TIME = "initial_time";
@@ -118,6 +127,8 @@ public enum Version {
private TextView mPmTextView;
private View mAmPmLayout;
private RadialPickerLayout mTimePicker;
+ ImageView iv_change_mode;
+ TimePicker tp_spinner;
private int mSelectedColor;
private int mUnselectedColor;
@@ -132,6 +143,9 @@ public enum Version {
private boolean mThemeDarkChanged;
private boolean mVibrate;
private Integer mAccentColor = null;
+ private int mSpinnerTextColor = -1;
+ private int mSpinnerBackgroundColor = -1;
+ private boolean mSpinnerDarkmode;
private boolean mDismissOnPause;
private boolean mEnableSeconds;
private boolean mEnableMinutes;
@@ -146,6 +160,8 @@ public enum Version {
private TimepointLimiter mLimiter = mDefaultLimiter;
private Locale mLocale = Locale.getDefault();
+ boolean spinnervisible;
+
// For hardware IME input.
private char mPlaceholderText;
private String mDoublePlaceholderText;
@@ -194,7 +210,7 @@ public TimePickerDialog() {
*/
@SuppressWarnings({"SameParameterValue", "WeakerAccess"})
public static TimePickerDialog newInstance(OnTimeSetListener callback,
- int hourOfDay, int minute, int second, boolean is24HourMode) {
+ int hourOfDay, int minute, int second, boolean is24HourMode) {
TimePickerDialog ret = new TimePickerDialog();
ret.initialize(callback, hourOfDay, minute, second, is24HourMode);
return ret;
@@ -209,7 +225,7 @@ public static TimePickerDialog newInstance(OnTimeSetListener callback,
* @return a new TimePickerDialog instance.
*/
public static TimePickerDialog newInstance(OnTimeSetListener callback,
- int hourOfDay, int minute, boolean is24HourMode) {
+ int hourOfDay, int minute, boolean is24HourMode) {
return TimePickerDialog.newInstance(callback, hourOfDay, minute, 0, is24HourMode);
}
@@ -226,7 +242,7 @@ public static TimePickerDialog newInstance(OnTimeSetListener callback, boolean i
}
public void initialize(OnTimeSetListener callback,
- int hourOfDay, int minute, int second, boolean is24HourMode) {
+ int hourOfDay, int minute, int second, boolean is24HourMode) {
mCallback = callback;
mInitialTime = new Timepoint(hourOfDay, minute, second);
@@ -244,6 +260,10 @@ public void initialize(OnTimeSetListener callback,
mVersion = Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? Version.VERSION_1 : Version.VERSION_2;
// Throw away the current TimePicker, which might contain old state if the dialog instance is reused
mTimePicker = null;
+ spinnervisible = false;
+ mSpinnerTextColor = -1;
+ mSpinnerBackgroundColor = -1;
+ mSpinnerDarkmode = false;
}
/**
@@ -633,7 +653,7 @@ public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(AppCompatDialogFragment.STYLE_NO_TITLE, 0);
if (savedInstanceState != null && savedInstanceState.containsKey(KEY_INITIAL_TIME)
- && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) {
+ && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) {
mInitialTime = savedInstanceState.getParcelable(KEY_INITIAL_TIME);
mIs24HourMode = savedInstanceState.getBoolean(KEY_IS_24_HOUR_VIEW);
mInKbMode = savedInstanceState.getBoolean(KEY_IN_KB_MODE);
@@ -672,8 +692,44 @@ affect the behaviour of the picker (in the unlikely event the user reconfigures
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- int viewRes = mVersion == Version.VERSION_1 ? R.layout.mdtp_time_picker_dialog : R.layout.mdtp_time_picker_dialog_v2;
+ Bundle savedInstanceState) {
+
+ int viewRes;
+ switch (mVersion){
+ case VERSION_1:
+ viewRes = R.layout.mdtp_time_picker_dialog;
+ break;
+ case VERSION_3:
+ viewRes = R.layout.mdtp_time_spinner_dialog_v2;
+ if(mEnableSeconds){
+ Log.e(TAG,"Seconds not implemented in spinner");
+ }
+ if(mDefaultLimiter.getDisabledTimes().length > 0){
+ Log.e(TAG,"Disabled times not implemented in spinner");
+ }
+ if(mDefaultLimiter.getSelectableTimes().length > 0){
+ Log.e(TAG,"Selected times not implemented in spinner");
+ }
+ break;
+ case VERSION_4:
+ viewRes = R.layout.mdtp_time_picker_spinner_dialog_v2;
+ if(mEnableSeconds){
+ Log.e(TAG,"Seconds not implemented in spinner");
+ }
+ if(mDefaultLimiter.getDisabledTimes().length > 0){
+ Log.e(TAG,"Disabled times not implemented in spinner");
+ }
+ if(mDefaultLimiter.getSelectableTimes().length > 0){
+ Log.e(TAG,"Selected times not implemented in spinner");
+ }
+ break;
+ case VERSION_2:
+ default:
+ viewRes = R.layout.mdtp_time_picker_dialog_v2;
+ break;
+ }
+
+
View view = inflater.inflate(viewRes, container,false);
KeyboardListener keyboardListener = new KeyboardListener();
view.findViewById(R.id.mdtp_time_picker_dialog).setOnKeyListener(keyboardListener);
@@ -718,37 +774,91 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
mPmText = amPmTexts[1];
mHapticFeedbackController = new HapticFeedbackController(getActivity());
+ mInitialTime = roundToNearest(mInitialTime);
- if(mTimePicker != null) {
- mInitialTime = new Timepoint(mTimePicker.getHours(), mTimePicker.getMinutes(), mTimePicker.getSeconds());
+ if(mVersion == Version.VERSION_3){
+ mHourView.setTextColor(mSelectedColor);
+ mMinuteView.setTextColor(mSelectedColor);
}
- mInitialTime = roundToNearest(mInitialTime);
+ if(mVersion != Version.VERSION_3) {
- mTimePicker = view.findViewById(R.id.mdtp_time_picker);
- mTimePicker.setOnValueSelectedListener(this);
- mTimePicker.setOnKeyListener(keyboardListener);
- mTimePicker.initialize(getActivity(), mLocale, this, mInitialTime, mIs24HourMode);
+ if (mTimePicker != null) {
+ mInitialTime = new Timepoint(mTimePicker.getHours(), mTimePicker.getMinutes(), mTimePicker.getSeconds());
+ }
+ mTimePicker = view.findViewById(R.id.mdtp_time_picker);
+ mTimePicker.setOnValueSelectedListener(this);
+ mTimePicker.setOnKeyListener(keyboardListener);
+ mTimePicker.initialize(getActivity(), mLocale, this, mInitialTime, mIs24HourMode);
+
+ int currentItemShowing = HOUR_INDEX;
+ if (savedInstanceState != null &&
+ savedInstanceState.containsKey(KEY_CURRENT_ITEM_SHOWING)) {
+ currentItemShowing = savedInstanceState.getInt(KEY_CURRENT_ITEM_SHOWING);
+ }
+ setCurrentItemShowing(currentItemShowing, false, true, true);
+ mTimePicker.invalidate();
- int currentItemShowing = HOUR_INDEX;
- if (savedInstanceState != null &&
- savedInstanceState.containsKey(KEY_CURRENT_ITEM_SHOWING)) {
- currentItemShowing = savedInstanceState.getInt(KEY_CURRENT_ITEM_SHOWING);
}
- setCurrentItemShowing(currentItemShowing, false, true, true);
- mTimePicker.invalidate();
+ if(mVersion == Version.VERSION_3 || mVersion == Version.VERSION_4) {
+
+ iv_change_mode = view.findViewById(R.id.iv_change_mode);
+ tp_spinner = view.findViewById(R.id.mdtp_time_spinner);
+ tp_spinner.setIs24HourView(mIs24HourMode);
+
+ tp_spinner.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
+ @Override
+ public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
+ int amorpm = hourOfDay >= 12 ? PM : AM;
+ updateAmPmDisplay(amorpm);
+
+ if(mVersion != Version.VERSION_3) {
+ mTimePicker.setTime(new Timepoint(hourOfDay, minute));
+ updateDisplay(false);
+ }
+ setHour(hourOfDay, true);
+ setMinute(minute);
+ }
+ });
+
+ }
+
+ if(mVersion == Version.VERSION_4) {
+ iv_change_mode.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (spinnervisible) {
+ mTimePicker.setVisibility(View.VISIBLE);
+ tp_spinner.setVisibility(View.GONE);
+ iv_change_mode.setImageDrawable(getResources().getDrawable(R.drawable.ic_spinner));
+ } else {
+ mTimePicker.setVisibility(View.GONE);
+ tp_spinner.setVisibility(View.VISIBLE);
+ iv_change_mode.setImageDrawable(getResources().getDrawable(R.drawable.ic_clock));
+ }
+
+ spinnervisible = !spinnervisible;
+ }
+ });
+ }
mHourView.setOnClickListener(v -> {
- setCurrentItemShowing(HOUR_INDEX, true, false, true);
- tryVibrate();
+ if(mVersion != Version.VERSION_3) {
+ setCurrentItemShowing(HOUR_INDEX, true, false, true);
+ tryVibrate();
+ }
});
mMinuteView.setOnClickListener(v -> {
- setCurrentItemShowing(MINUTE_INDEX, true, false, true);
- tryVibrate();
+ if(mVersion != Version.VERSION_3) {
+ setCurrentItemShowing(MINUTE_INDEX, true, false, true);
+ tryVibrate();
+ }
});
mSecondView.setOnClickListener(view1 -> {
- setCurrentItemShowing(SECOND_INDEX, true, false, true);
- tryVibrate();
+ if(mVersion != Version.VERSION_3) {
+ setCurrentItemShowing(SECOND_INDEX, true, false, true);
+ tryVibrate();
+ }
});
mOkButton = view.findViewById(R.id.mdtp_ok);
@@ -779,29 +889,49 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
// Enable or disable the AM/PM view.
if (mIs24HourMode) {
mAmPmLayout.setVisibility(View.GONE);
- } else {
+ } else {
OnClickListener listener = v -> {
// Don't do anything if either AM or PM are disabled
if (isAmDisabled() || isPmDisabled()) return;
tryVibrate();
- int amOrPm = mTimePicker.getIsCurrentlyAmOrPm();
+ int amOrPm;
+ if(mVersion == Version.VERSION_3){
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+ amOrPm = tp_spinner.getHour() < 12 ? AM : PM;
+ }else{
+ amOrPm = tp_spinner.getCurrentHour() < 12 ? AM : PM;
+ }
+ }else {
+ amOrPm = mTimePicker.getIsCurrentlyAmOrPm();
+ }
if (amOrPm == AM) {
amOrPm = PM;
} else if (amOrPm == PM) {
amOrPm = AM;
}
- mTimePicker.setAmOrPm(amOrPm);
- };
- mAmTextView .setVisibility(View.GONE);
- mPmTextView.setVisibility(View.VISIBLE);
- mAmPmLayout.setOnClickListener(listener);
- if (mVersion == Version.VERSION_2) {
- mAmTextView.setText(mAmText);
- mPmTextView.setText(mPmText);
- mAmTextView.setVisibility(View.VISIBLE);
- }
- updateAmPmDisplay(mInitialTime.isAM() ? AM : PM);
+ if(mVersion == Version.VERSION_3) {
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+ if (amOrPm == PM) tp_spinner.setHour(tp_spinner.getHour() + 12);
+ else tp_spinner.setHour(tp_spinner.getHour() - 12);
+ }else{
+ if (amOrPm == PM) tp_spinner.setCurrentHour(tp_spinner.getCurrentHour() + 12);
+ else tp_spinner.setCurrentHour(tp_spinner.getCurrentHour() - 12);
+ }
+ updateAmPmDisplay(amOrPm);
+ }else{
+ mTimePicker.setAmOrPm(amOrPm);
+ }
+ };
+ mAmTextView .setVisibility(View.GONE);
+ mPmTextView.setVisibility(View.VISIBLE);
+ mAmPmLayout.setOnClickListener(listener);
+ if (mVersion == Version.VERSION_2 || mVersion == Version.VERSION_4) {
+ mAmTextView.setText(mAmText);
+ mPmTextView.setText(mPmText);
+ mAmTextView.setVisibility(View.VISIBLE);
+ }
+ updateAmPmDisplay(mInitialTime.isAM() ? AM : PM);
}
@@ -925,7 +1055,7 @@ else if (mIs24HourMode && !mEnableSeconds && mEnableMinutes) {
if (!mIs24HourMode) {
RelativeLayout.LayoutParams paramsAmPm = new RelativeLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT
+ LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT
);
paramsAmPm.addRule(RelativeLayout.RIGHT_OF, R.id.mdtp_hour_space);
paramsAmPm.addRule(RelativeLayout.ALIGN_BASELINE, R.id.mdtp_hour_space);
@@ -989,6 +1119,7 @@ else if (mIs24HourMode && !mEnableSeconds && mEnableMinutes) {
view.findViewById(R.id.mdtp_time_display_background).setBackgroundColor(mAccentColor);
view.findViewById(R.id.mdtp_time_display).setBackgroundColor(mAccentColor);
+
// Button text can have a different color
if (mOkColor == null) mOkColor = mAccentColor;
mOkButton.setTextColor(mOkColor);
@@ -1004,8 +1135,18 @@ else if (mIs24HourMode && !mEnableSeconds && mEnableMinutes) {
int darkBackgroundColor = ContextCompat.getColor(context, R.color.mdtp_light_gray);
int lightGray = ContextCompat.getColor(context, R.color.mdtp_light_gray);
- mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground);
+ if(mVersion != Version.VERSION_3) {
+ mTimePicker.setBackgroundColor(mThemeDark ? lightGray : circleBackground);
+ }
+ if(mVersion == Version.VERSION_3 || mVersion == Version.VERSION_4) {
+ if (mSpinnerBackgroundColor != -1) tp_spinner.setBackgroundColor(mSpinnerBackgroundColor);
+ else tp_spinner.setBackgroundColor(mThemeDark ? lightGray : circleBackground);
+ //Set spinnertext color
+ if (mSpinnerTextColor != -1) setSpinnerTextColor(tp_spinner,mSpinnerTextColor,mSpinnerDarkmode);
+ else setSpinnerTextColor(tp_spinner, mThemeDark ? circleBackground : lightGray,mThemeDark);
+ }
view.findViewById(R.id.mdtp_time_picker_dialog).setBackgroundColor(mThemeDark ? darkBackgroundColor : backgroundColor);
+
return view;
}
@@ -1051,7 +1192,7 @@ public void tryVibrate() {
}
private void updateAmPmDisplay(int amOrPm) {
- if (mVersion == Version.VERSION_2) {
+ if (mVersion == Version.VERSION_2 || mVersion == Version.VERSION_4) {
if (amOrPm == AM) {
mAmTextView.setTextColor(mSelectedColor);
mPmTextView.setTextColor(mUnselectedColor);
@@ -1118,6 +1259,16 @@ public void onValueSelected(Timepoint newValue) {
setSecond(newValue.getSecond());
mTimePicker.setContentDescription(mSecondPickerDescription + ": " + newValue.getSecond());
if(!mIs24HourMode) updateAmPmDisplay(newValue.isAM() ? AM : PM);
+
+ if(mVersion == Version.VERSION_4) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ tp_spinner.setHour(newValue.getHour());
+ tp_spinner.setMinute(newValue.getMinute());
+ } else {
+ tp_spinner.setCurrentHour(newValue.getHour());
+ tp_spinner.setCurrentMinute(newValue.getMinute());
+ }
+ }
}
@Override
@@ -1227,7 +1378,7 @@ private void setSecond(int value) {
// Show either Hours or Minutes.
private void setCurrentItemShowing(int index, boolean animateCircle, boolean delayLabelAnimate,
- boolean announce) {
+ boolean announce) {
mTimePicker.setCurrentItemShowing(index, animateCircle);
TextView labelToAnimate;
@@ -1260,12 +1411,14 @@ private void setCurrentItemShowing(int index, boolean animateCircle, boolean del
labelToAnimate = mSecondView;
}
- int hourColor = (index == HOUR_INDEX) ? mSelectedColor : mUnselectedColor;
- int minuteColor = (index == MINUTE_INDEX) ? mSelectedColor : mUnselectedColor;
- int secondColor = (index == SECOND_INDEX) ? mSelectedColor : mUnselectedColor;
- mHourView.setTextColor(hourColor);
- mMinuteView.setTextColor(minuteColor);
- mSecondView.setTextColor(secondColor);
+ if(mVersion != Version.VERSION_3) {
+ int hourColor = (index == HOUR_INDEX) ? mSelectedColor : mUnselectedColor;
+ int minuteColor = (index == MINUTE_INDEX) ? mSelectedColor : mUnselectedColor;
+ int secondColor = (index == SECOND_INDEX) ? mSelectedColor : mUnselectedColor;
+ mHourView.setTextColor(hourColor);
+ mMinuteView.setTextColor(minuteColor);
+ mSecondView.setTextColor(secondColor);
+ }
ObjectAnimator pulseAnimator = Utils.getPulseAnimator(labelToAnimate, 0.85f, 1.1f);
if (delayLabelAnimate) {
@@ -1323,7 +1476,7 @@ private boolean processKeyUp(int keyCode) {
|| keyCode == KeyEvent.KEYCODE_6 || keyCode == KeyEvent.KEYCODE_7
|| keyCode == KeyEvent.KEYCODE_8 || keyCode == KeyEvent.KEYCODE_9
|| (!mIs24HourMode &&
- (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) {
+ (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) {
if (!mInKbMode) {
if (mTimePicker == null) {
// Something's wrong, because time picker should definitely not be null.
@@ -1479,9 +1632,9 @@ private void updateDisplay(boolean allowEmptyDisplay) {
String minuteFormat = (enteredZeros[1]) ? "%02d" : "%2d";
String secondFormat = (enteredZeros[1]) ? "%02d" : "%2d";
String hourStr = (values[0] == -1) ? mDoublePlaceholderText :
- String.format(hourFormat, values[0]).replace(' ', mPlaceholderText);
+ String.format(hourFormat, values[0]).replace(' ', mPlaceholderText);
String minuteStr = (values[1] == -1) ? mDoublePlaceholderText :
- String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText);
+ String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText);
String secondStr = (values[2] == -1) ? mDoublePlaceholderText :
String.format(secondFormat, values[1]).replace(' ', mPlaceholderText);
mHourView.setText(hourStr);
@@ -1890,11 +2043,123 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
public void notifyOnDateListener() {
if (mCallback != null) {
- mCallback.onTimeSet(this, mTimePicker.getHours(), mTimePicker.getMinutes(), mTimePicker.getSeconds());
+ if(mVersion == Version.VERSION_3){
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ mCallback.onTimeSet(this,tp_spinner.getHour(),tp_spinner.getMinute(),0);
+ }else {
+ mCallback.onTimeSet(this, tp_spinner.getCurrentHour(), tp_spinner.getCurrentMinute(), 0);
+ }
+ }else {
+ mCallback.onTimeSet(this, mTimePicker.getHours(), mTimePicker.getMinutes(), mTimePicker.getSeconds());
+ }
}
}
public Timepoint getSelectedTime() {
return mTimePicker.getTime();
}
+
+
+ private void setSpinnerTextColor(TimePicker tp, int color, boolean darkmode){
+ LinearLayout ll_child = (LinearLayout) tp.getChildAt(0);
+ LinearLayout ll_child2 = (LinearLayout) ll_child.getChildAt(0);
+
+ Class> numberPickerClass = null;
+ Field selectionDivider = null;
+ try {
+ numberPickerClass = Class.forName("android.widget.NumberPicker");
+ selectionDivider = numberPickerClass.getDeclaredField("mSelectionDivider");
+
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+
+ for(int i = 0; i < 3; i++) {
+ if(ll_child2.getChildAt(i) instanceof NumberPicker) {
+ NumberPicker numberPicker = (NumberPicker) ll_child2.getChildAt(i);
+ EditText et_child = (EditText) numberPicker.getChildAt(0);
+ Field selectorWheelPaintField = null;
+ try {
+ selectorWheelPaintField = numberPicker.getClass().getDeclaredField("mSelectorWheelPaint");
+ selectorWheelPaintField.setAccessible(true);
+ et_child.setTextColor(color);
+ ((Paint) selectorWheelPaintField.get(numberPicker)).setColor(color);
+ numberPicker.invalidate();
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ if(darkmode) {
+ try {
+ selectionDivider.setAccessible(true);
+ selectionDivider.set(numberPicker, getResources().getDrawable(
+ R.drawable.np_numberpicker_selection_divider_white));
+
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (Resources.NotFoundException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ }else{ //TextView ":"
+ TextView textView = (TextView) ll_child2.getChildAt(i);
+ textView.setTextColor(color);
+ }
+ }
+
+ //For AM/PM Picker
+ NumberPicker numberPicker = (NumberPicker) ll_child.getChildAt(1);
+ EditText et_child = (EditText) numberPicker.getChildAt(0);
+ Field selectorWheelPaintField;
+ try {
+ selectorWheelPaintField = numberPicker.getClass().getDeclaredField("mSelectorWheelPaint");
+ selectorWheelPaintField.setAccessible(true);
+ et_child.setTextColor(color);
+ ((Paint) selectorWheelPaintField.get(numberPicker)).setColor(color);
+ numberPicker.invalidate();
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ if(darkmode) {
+ try {
+ selectionDivider.setAccessible(true);
+ selectionDivider.set(numberPicker, getResources().getDrawable(
+ R.drawable.np_numberpicker_selection_divider_white));
+
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (Resources.NotFoundException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Set the spinner text color of this dialog
+ * @param color the text color you want
+ * @param darkmode set the divider to white
+ */
+ public void setSpinnerTextColor(@ColorInt int color, boolean darkmode){
+ mSpinnerTextColor = Color.argb(255, Color.red(color), Color.green(color), Color.blue(color));
+ mSpinnerDarkmode = darkmode;
+ }
+
+ /**
+ * Set the spinner bg color of this dialog
+ * @param color the bg color you want
+ */
+ public void setSpinnerBackgroundColor(@ColorInt int color){
+ mSpinnerBackgroundColor = Color.argb(255, Color.red(color), Color.green(color), Color.blue(color));
+ }
}
diff --git a/library/src/main/res/drawable/ic_clock.xml b/library/src/main/res/drawable/ic_clock.xml
new file mode 100644
index 00000000..749cd864
--- /dev/null
+++ b/library/src/main/res/drawable/ic_clock.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/library/src/main/res/drawable/ic_spinner.xml b/library/src/main/res/drawable/ic_spinner.xml
new file mode 100644
index 00000000..29bdd0be
--- /dev/null
+++ b/library/src/main/res/drawable/ic_spinner.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/library/src/main/res/drawable/np_numberpicker_selection_divider_white.9.png b/library/src/main/res/drawable/np_numberpicker_selection_divider_white.9.png
new file mode 100644
index 00000000..25f21f7f
Binary files /dev/null and b/library/src/main/res/drawable/np_numberpicker_selection_divider_white.9.png differ
diff --git a/library/src/main/res/layout-land/mdtp_time_picker_spinner_dialog_v2.xml b/library/src/main/res/layout-land/mdtp_time_picker_spinner_dialog_v2.xml
new file mode 100644
index 00000000..e187ece9
--- /dev/null
+++ b/library/src/main/res/layout-land/mdtp_time_picker_spinner_dialog_v2.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/src/main/res/layout-land/mdtp_time_spinner_dialog_v2.xml b/library/src/main/res/layout-land/mdtp_time_spinner_dialog_v2.xml
new file mode 100644
index 00000000..161a5a60
--- /dev/null
+++ b/library/src/main/res/layout-land/mdtp_time_spinner_dialog_v2.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/src/main/res/layout/mdtp_time_picker_spinner_dialog_v2.xml b/library/src/main/res/layout/mdtp_time_picker_spinner_dialog_v2.xml
new file mode 100644
index 00000000..bca0508a
--- /dev/null
+++ b/library/src/main/res/layout/mdtp_time_picker_spinner_dialog_v2.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/src/main/res/layout/mdtp_time_spinner_dialog_v2.xml b/library/src/main/res/layout/mdtp_time_spinner_dialog_v2.xml
new file mode 100644
index 00000000..a879707d
--- /dev/null
+++ b/library/src/main/res/layout/mdtp_time_spinner_dialog_v2.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/src/main/res/values/colors.xml b/library/src/main/res/values/colors.xml
index 5c8a5dcf..b282ea1f 100644
--- a/library/src/main/res/values/colors.xml
+++ b/library/src/main/res/values/colors.xml
@@ -62,4 +62,5 @@
#ffffff
#888888
#bfbfbf
+
diff --git a/library/src/main/res/values/dimens.xml b/library/src/main/res/values/dimens.xml
index eea275f2..d138fb2a 100644
--- a/library/src/main/res/values/dimens.xml
+++ b/library/src/main/res/values/dimens.xml
@@ -85,4 +85,6 @@
14sp
64dp
8dp
+
+ 5dp
\ No newline at end of file
diff --git a/library/src/main/res/values/strings.xml b/library/src/main/res/values/strings.xml
index a4393ec5..d309db47 100644
--- a/library/src/main/res/values/strings.xml
+++ b/library/src/main/res/values/strings.xml
@@ -91,4 +91,5 @@
am
pm
+ Change the TimePicker mode
diff --git a/sample/src/main/java/com/wdullaer/datetimepickerexample/TimePickerFragment.java b/sample/src/main/java/com/wdullaer/datetimepickerexample/TimePickerFragment.java
index 7eab7af2..1f24cd8e 100644
--- a/sample/src/main/java/com/wdullaer/datetimepickerexample/TimePickerFragment.java
+++ b/sample/src/main/java/com/wdullaer/datetimepickerexample/TimePickerFragment.java
@@ -8,8 +8,10 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
+import android.widget.Spinner;
import android.widget.TextView;
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
@@ -32,9 +34,14 @@ public class TimePickerFragment extends Fragment implements TimePickerDialog.OnT
private CheckBox enableSeconds;
private CheckBox limitSelectableTimes;
private CheckBox disableSpecificTimes;
- private CheckBox showVersion2;
+ private CheckBox spinnerTextColor;
+ private CheckBox spinnerBgColor;
+ //private CheckBox showVersion2;
+ private Spinner selectVersion;
private TimePickerDialog tpd;
+ TimePickerDialog.Version mVersion;
+
public TimePickerFragment() {
// Required empty public constructor
}
@@ -56,7 +63,10 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
enableSeconds = view.findViewById(R.id.enable_seconds);
limitSelectableTimes = view.findViewById(R.id.limit_times);
disableSpecificTimes = view.findViewById(R.id.disable_times);
- showVersion2 = view.findViewById(R.id.show_version_2);
+ spinnerTextColor = view.findViewById(R.id.spinner_text_color);
+ spinnerBgColor = view.findViewById(R.id.spinner_bg_color);
+ selectVersion = view.findViewById(R.id.selectversion);
+ mVersion = TimePickerDialog.Version.VERSION_1;
view.findViewById(R.id.original_button).setOnClickListener(view1 -> {
Calendar now = Calendar.getInstance();
@@ -69,6 +79,32 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
).show();
});
+ selectVersion.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView> adapterView, View view, int pos, long l) {
+ switch (pos){
+ case 1:
+ mVersion = TimePickerDialog.Version.VERSION_2;
+ break;
+ case 2:
+ mVersion = TimePickerDialog.Version.VERSION_3;
+ break;
+ case 3:
+ mVersion = TimePickerDialog.Version.VERSION_4;
+ break;
+ case 0:
+ default:
+ mVersion = TimePickerDialog.Version.VERSION_1;
+ break;
+ }
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView> adapterView) {
+
+ }
+ });
+
// Show a timepicker when the timeButton is clicked
timeButton.setOnClickListener(v -> {
Calendar now = Calendar.getInstance();
@@ -93,11 +129,22 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
mode24Hours.isChecked()
);
}
+
tpd.setThemeDark(modeDarkTime.isChecked());
tpd.vibrate(vibrateTime.isChecked());
tpd.dismissOnPause(dismissTime.isChecked());
tpd.enableSeconds(enableSeconds.isChecked());
- tpd.setVersion(showVersion2.isChecked() ? TimePickerDialog.Version.VERSION_2 : TimePickerDialog.Version.VERSION_1);
+ tpd.setVersion(mVersion);
+
+ if(spinnerTextColor.isChecked()){
+ tpd.setSpinnerTextColor(Color.parseColor("#B71C1C"),false);
+ }
+ if(spinnerBgColor.isChecked()){
+ tpd.setSpinnerBackgroundColor(Color.parseColor("#5C6BC0"));
+ }
+
+ tpd.setVersion(mVersion);
+
if (modeCustomAccentTime.isChecked()) {
tpd.setAccentColor(Color.parseColor("#9C27B0"));
}
diff --git a/sample/src/main/res/layout/timepicker_layout.xml b/sample/src/main/res/layout/timepicker_layout.xml
index 8f2d4b2e..b811906b 100644
--- a/sample/src/main/res/layout/timepicker_layout.xml
+++ b/sample/src/main/res/layout/timepicker_layout.xml
@@ -25,11 +25,7 @@
android:layout_height="wrap_content"
android:text="@string/original_button"/>
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml
index 6457f9c0..4a7d91fb 100644
--- a/sample/src/main/res/values/strings.xml
+++ b/sample/src/main/res/values/strings.xml
@@ -33,4 +33,14 @@
Date
Date+Time
+ Select a Version
+
+ - Version 1: Default
+ - Version 2: Marshmallow
+ - Version 3: Spinner
+ - Version 4: Marshmallow + Spinner
+
+
+ Use custom spinner-text color
+ Use custom spinner-bg color