提交 d6391b95 编写于 作者: 门心叼龙's avatar 门心叼龙

refresh update

上级 5e9b42d4
......@@ -14,7 +14,7 @@
<option value="$PROJECT_DIR$/module_find" />
<option value="$PROJECT_DIR$/module_main" />
<option value="$PROJECT_DIR$/module_me" />
<option value="$PROJECT_DIR$/module_trip" />
<option value="$PROJECT_DIR$/module_news" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
......
......@@ -9,7 +9,7 @@
<module fileurl="file://$PROJECT_DIR$/module_find/module_find.iml" filepath="$PROJECT_DIR$/module_find/module_find.iml" />
<module fileurl="file://$PROJECT_DIR$/module_main/module_main.iml" filepath="$PROJECT_DIR$/module_main/module_main.iml" />
<module fileurl="file://$PROJECT_DIR$/module_me/module_me.iml" filepath="$PROJECT_DIR$/module_me/module_me.iml" />
<module fileurl="file://$PROJECT_DIR$/module_trip/module_trip.iml" filepath="$PROJECT_DIR$/module_trip/module_trip.iml" />
<module fileurl="file://$PROJECT_DIR$/module_news/module_news.iml" filepath="$PROJECT_DIR$/module_news/module_news.iml" />
</modules>
</component>
</project>
\ No newline at end of file
此差异已折叠。
......@@ -12,7 +12,6 @@
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
<excludeFolder url="file://$MODULE_DIR$/build" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
......
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')
api deps.support.recyclerview
api deps.support.app_compat
api deps.junit
api deps.testrunner
api deps.testespresso
}
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":lib_time_picker" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":lib_time_picker" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<afterSyncTasks>
<task>generateDebugSources</task>
</afterSyncTasks>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
<option name="PROJECT_TYPE" value="1" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
<output url="file://$MODULE_DIR$/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes" />
<output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/not_namespaced_r_class_sources/debug/generateDebugRFile/out" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/not_namespaced_r_class_sources/debugAndroidTest/processDebugAndroidTestResources/r" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/aapt_friendly_merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotation_processor_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations_typedef_file" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations_zip" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/intermediate-jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javac" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/library_and_local_jars_jni" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/library_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/packaged-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/packaged_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/public_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shader_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Gradle: com.android.support:customview-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:localbroadcastmanager-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.test:runner-1.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:interpolator-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:slidingpanelayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:drawerlayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:coordinatorlayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:collections:28.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:documentfile-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:swiperefreshlayout-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:cursoradapter-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:asynclayoutinflater-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.test.espresso:espresso-core-3.0.2" level="project" />
<orderEntry type="library" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:versionedparcelable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: junit:junit:4.12@jar" level="project" />
<orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:runtime-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:print-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.test:monitor-1.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:loader-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-3.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:viewpager-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-fragment-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-annotations:28.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-compat-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime-1.1.1" level="project" />
<orderEntry type="library" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" />
</component>
</module>
\ No newline at end of file
package com.github.florent37.singledateandtimepicker;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.github.florent37.singledateandtimepicker.test", appContext.getPackageName());
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.florent37.singledateandtimepicker"/>
package com.github.florent37.singledateandtimepicker;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class DateHelper {
public static Calendar getCalendarOfDate(Date date){
final Calendar calendar = Calendar.getInstance(Locale.getDefault());
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
return calendar;
}
public static int getHour(Date date){
return getCalendarOfDate(date).get(Calendar.HOUR);
}
public static int getHourOfDay(Date date){
return getCalendarOfDate(date).get(Calendar.HOUR);
}
public static int getHour(Date date, boolean isAmPm){
if(isAmPm){
return getHourOfDay(date);
} else {
return getHour(date);
}
}
public static int getMinuteOf(Date date) {
return getCalendarOfDate(date).get(Calendar.MINUTE);
}
public static Date today() {
return Calendar.getInstance(Locale.getDefault()).getTime();
}
public static int getMonth(Date date) {
return getCalendarOfDate(date).get(Calendar.MONTH);
}
}
package com.github.florent37.singledateandtimepicker;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.github.florent37.singledateandtimepicker.widget.WheelAmPmPicker;
import com.github.florent37.singledateandtimepicker.widget.WheelDayPicker;
import com.github.florent37.singledateandtimepicker.widget.WheelHourPicker;
import com.github.florent37.singledateandtimepicker.widget.WheelMinutePicker;
import com.github.florent37.singledateandtimepicker.widget.WheelPicker;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static com.github.florent37.singledateandtimepicker.DateHelper.getCalendarOfDate;
public class SingleDateAndTimePicker extends LinearLayout {
public static final boolean IS_CYCLIC_DEFAULT = true;
public static final boolean IS_CURVED_DEFAULT = false;
public static final boolean MUST_BE_ON_FUTUR_DEFAULT = false;
public static final int DELAY_BEFORE_CHECK_PAST = 200;
private static final int VISIBLE_ITEM_COUNT_DEFAULT = 7;
private static final int PM_HOUR_ADDITION = 12;
private static final CharSequence FORMAT_24_HOUR = "EEE d MMM H:mm";
private static final CharSequence FORMAT_12_HOUR = "EEE d MMM h:mm a";
//private WheelYearsPicker yearsPicker;
//private WheelMonthPicker monthPicker;
@NonNull
private final WheelDayPicker daysPicker;
@NonNull
private final WheelMinutePicker minutesPicker;
@NonNull
private final WheelHourPicker hoursPicker;
@NonNull
private final WheelAmPmPicker amPmPicker;
private List<WheelPicker> pickers = new ArrayList<>();
private List<OnDateChangedListener> listeners = new ArrayList<>();
private View dtSelector;
private boolean mustBeOnFuture;
@Nullable
private Date minDate;
@Nullable
private Date maxDate;
@NonNull
private Date defaultDate;
private boolean displayYears = false;
private boolean displayMonth = false;
private boolean displayDays = true;
private boolean displayMinutes = true;
private boolean displayHours = true;
private boolean isAmPm;
private int selectorHeight;
public SingleDateAndTimePicker(Context context) {
this(context, null);
}
public SingleDateAndTimePicker(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SingleDateAndTimePicker(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
defaultDate = new Date();
isAmPm = !(DateFormat.is24HourFormat(context));
inflate(context, R.layout.single_day_picker, this);
//yearsPicker = (WeelYearPicker) findViewById(R.id.yearPicker);
//monthPicker = (WeelMonthPicker) findViewById(R.id.monthPicker);
daysPicker = (WheelDayPicker) findViewById(R.id.daysPicker);
minutesPicker = (WheelMinutePicker) findViewById(R.id.minutesPicker);
hoursPicker = (WheelHourPicker) findViewById(R.id.hoursPicker);
amPmPicker = (WheelAmPmPicker) findViewById(R.id.amPmPicker);
dtSelector = findViewById(R.id.dtSelector);
pickers.addAll(Arrays.asList(
daysPicker,
minutesPicker,
hoursPicker,
amPmPicker
//monthPicker
//yearsPicker
));
init(context, attrs);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
daysPicker
.setOnDaySelectedListener(new WheelDayPicker.OnDaySelectedListener() {
@Override
public void onDaySelected(WheelDayPicker picker, int position, String name, Date date) {
updateListener();
checkMinMaxDate(picker);
}
});
minutesPicker
.setOnMinuteChangedListener(new WheelMinutePicker.OnMinuteChangedListener() {
@Override
public void onMinuteChanged(WheelMinutePicker picker, int minutes) {
updateListener();
checkMinMaxDate(picker);
}
})
.setOnFinishedLoopListener(new WheelMinutePicker.OnFinishedLoopListener() {
@Override
public void onFinishedLoop(WheelMinutePicker picker) {
hoursPicker.scrollTo(hoursPicker.getCurrentItemPosition() + 1);
}
});
hoursPicker
.setOnFinishedLoopListener(new WheelHourPicker.FinishedLoopListener() {
@Override
public void onFinishedLoop(WheelHourPicker picker) {
daysPicker.scrollTo(daysPicker.getCurrentItemPosition() + 1);
}
})
.setHourChangedListener(new WheelHourPicker.OnHourChangedListener() {
@Override
public void onHourChanged(WheelHourPicker picker, int hour) {
updateListener();
checkMinMaxDate(picker);
}
});
amPmPicker
.setAmPmListener(new WheelAmPmPicker.AmPmListener() {
@Override
public void onAmPmChanged(WheelAmPmPicker picker, boolean isAm) {
updateListener();
checkMinMaxDate(picker);
}
});
setDefaultDate(this.defaultDate); //update displayed date
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
for (WheelPicker picker : pickers) {
picker.setEnabled(enabled);
}
}
public void setDisplayDays(boolean displayDays) {
this.displayDays = displayDays;
daysPicker.setVisibility(displayDays ? VISIBLE : GONE);
}
public void setDisplayMinutes(boolean displayMinutes) {
this.displayMinutes = displayMinutes;
minutesPicker.setVisibility(displayMinutes ? VISIBLE : GONE);
}
public void setDisplayHours(boolean displayHours) {
this.displayHours = displayHours;
hoursPicker.setVisibility(displayHours ? VISIBLE : GONE);
setIsAmPm(this.isAmPm);
hoursPicker.setIsAmPm(isAmPm);
}
public void setTodayText(String todayText) {
if (todayText != null && !todayText.isEmpty()) {
daysPicker.setTodayText(todayText);
}
}
public void setCurved(boolean curved) {
for (WheelPicker picker : pickers) {
picker.setCurved(curved);
}
}
public void setCyclic(boolean cyclic) {
for (WheelPicker picker : pickers) {
picker.setCyclic(cyclic);
}
}
public void setTextSize(int textSize) {
for (WheelPicker picker : pickers) {
picker.setItemTextSize(textSize);
}
}
public void setSelectedTextColor(int selectedTextColor) {
for (WheelPicker picker : pickers) {
picker.setSelectedItemTextColor(selectedTextColor);
}
}
public void setTextColor(int textColor) {
for (WheelPicker picker : pickers) {
picker.setItemTextColor(textColor);
}
}
public void setSelectorColor(int selectorColor) {
dtSelector.setBackgroundColor(selectorColor);
}
public void setSelectorHeight(int selectorHeight) {
final ViewGroup.LayoutParams dtSelectorLayoutParams = dtSelector.getLayoutParams();
dtSelectorLayoutParams.height = selectorHeight;
dtSelector.setLayoutParams(dtSelectorLayoutParams);
}
public void setVisibleItemCount(int visibleItemCount) {
for (WheelPicker picker : pickers) {
picker.setVisibleItemCount(visibleItemCount);
}
}
public void setIsAmPm(boolean isAmPm) {
this.isAmPm = isAmPm;
amPmPicker.setVisibility((isAmPm && displayHours) ? VISIBLE : GONE);
hoursPicker.setIsAmPm(isAmPm);
}
public void setDayFormatter(SimpleDateFormat simpleDateFormat) {
if (simpleDateFormat != null) {
this.daysPicker.setDayFormatter(simpleDateFormat);
}
}
public boolean isAmPm() {
return isAmPm;
}
public Date getMinDate() {
return minDate;
}
public void setMinDate(Date minDate) {
this.minDate = minDate;
}
public Date getMaxDate() {
return maxDate;
}
public void setMaxDate(Date maxDate) {
this.maxDate = maxDate;
}
private void checkMinMaxDate(final WheelPicker picker) {
checkBeforeMinDate(picker);
checkAfterMaxDate(picker);
}
private void checkBeforeMinDate(final WheelPicker picker) {
picker.postDelayed(new Runnable() {
@Override
public void run() {
if (minDate != null && isBeforeMinDate(getDate())) {
for (WheelPicker p : pickers) {
p.scrollTo(p.findIndexOfDate(minDate));
}
}
}
}, DELAY_BEFORE_CHECK_PAST);
}
private void checkAfterMaxDate(final WheelPicker picker) {
picker.postDelayed(new Runnable() {
@Override
public void run() {
if (maxDate != null && isAfterMaxDate(getDate())) {
for (WheelPicker p : pickers) {
p.scrollTo(p.findIndexOfDate(maxDate));
}
}
}
}, DELAY_BEFORE_CHECK_PAST);
}
private boolean isBeforeMinDate(Date date) {
return getCalendarOfDate(date).before(getCalendarOfDate(minDate));
}
private boolean isAfterMaxDate(Date date) {
return getCalendarOfDate(date).after(getCalendarOfDate(maxDate));
}
public void addOnDateChangedListener(OnDateChangedListener listener) {
this.listeners.add(listener);
}
public void removeOnDateChangedListener(OnDateChangedListener listener) {
this.listeners.remove(listener);
}
public void checkPickersMinMax() {
for (WheelPicker picker : pickers) {
checkMinMaxDate(picker);
}
}
public Date getDate() {
int hour = hoursPicker.getCurrentHour();
if (isAmPm && amPmPicker.isPm()) {
hour += PM_HOUR_ADDITION;
}
final int minute = minutesPicker.getCurrentMinute();
final Calendar calendar = Calendar.getInstance();
final Date dayDate = daysPicker.getCurrentDate();
calendar.setTime(dayDate);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
return calendar.getTime();
}
public void setStepMinutes(int minutesStep) {
minutesPicker.setStepMinutes(minutesStep);
}
public void setHoursStep(int hoursStep) {
hoursPicker.setHoursStep(hoursStep);
}
public void setDefaultHours(String hour) {
hoursPicker.setDefault(hour);
}
public void setDefaultDate(Date date) {
if (date != null) {
this.defaultDate = date;
for (WheelPicker picker : pickers) {
picker.setDefaultDate(defaultDate);
}
}
}
public void selectDate(Calendar calendar) {
if (calendar == null) {
return;
}
final Date date = calendar.getTime();
for (WheelPicker picker : pickers) {
picker.selectDate(date);
}
}
private void updateListener() {
final Date date = getDate();
final CharSequence format = isAmPm ? FORMAT_12_HOUR : FORMAT_24_HOUR;
final String displayed = DateFormat.format(format, date).toString();
for (OnDateChangedListener listener : listeners) {
listener.onDateChanged(displayed, date);
}
}
public void setMustBeOnFuture(boolean mustBeOnFuture) {
this.mustBeOnFuture = mustBeOnFuture;
if (mustBeOnFuture) {
minDate = Calendar.getInstance().getTime(); //minDate is Today
}
}
public boolean mustBeOnFuture() {
return mustBeOnFuture;
}
private void init(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SingleDateAndTimePicker);
final Resources resources = getResources();
setTodayText(a.getString(R.styleable.SingleDateAndTimePicker_picker_todayText));
setTextColor(a.getColor(R.styleable.SingleDateAndTimePicker_picker_textColor, ContextCompat.getColor(context, R.color.picker_default_text_color)));
setSelectedTextColor(a.getColor(R.styleable.SingleDateAndTimePicker_picker_selectedTextColor, ContextCompat.getColor(context, R.color.picker_default_selected_text_color)));
setSelectorColor(a.getColor(R.styleable.SingleDateAndTimePicker_picker_selectorColor, ContextCompat.getColor(context, R.color.picker_default_selector_color)));
setSelectorHeight(a.getDimensionPixelSize(R.styleable.SingleDateAndTimePicker_picker_selectorHeight, resources.getDimensionPixelSize(R.dimen.wheelSelectorHeight)));
setTextSize(a.getDimensionPixelSize(R.styleable.SingleDateAndTimePicker_picker_textSize, resources.getDimensionPixelSize(R.dimen.WheelItemTextSize)));
setCurved(a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_curved, IS_CURVED_DEFAULT));
setCyclic(a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_cyclic, IS_CYCLIC_DEFAULT));
setMustBeOnFuture(a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_mustBeOnFuture, MUST_BE_ON_FUTUR_DEFAULT));
setVisibleItemCount(a.getInt(R.styleable.SingleDateAndTimePicker_picker_visibleItemCount, VISIBLE_ITEM_COUNT_DEFAULT));
displayMonth = a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_displayMonth, displayMonth);
setDisplayDays(a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_displayYears, displayYears));
setDisplayDays(a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_displayDays, displayDays));
setDisplayMinutes(a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_displayMinutes, displayMinutes));
setDisplayHours(a.getBoolean(R.styleable.SingleDateAndTimePicker_picker_displayHours, displayHours));
a.recycle();
}
public interface OnDateChangedListener {
void onDateChanged(String displayed, Date date);
}
}
package com.github.florent37.singledateandtimepicker.dialog;
import android.graphics.Color;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.STEP_MINUTES_DEFAULT;
/**
* Created by nor on 1/2/2017.
*/
public abstract class BaseDialog {
public static final int DEFAULT_ITEM_COUNT_MODE_CURVED = 7;
public static final int DEFAULT_ITEM_COUNT_MODE_NORMAL = 5;
private boolean isDisplaying;
@Nullable
@ColorInt
protected Integer backgroundColor = Color.WHITE;
@Nullable
@ColorInt
protected Integer mainColor = Color.BLUE;
@Nullable
@ColorInt
protected Integer titleTextColor = null;
protected boolean okClicked = false;
protected boolean curved = false;
protected boolean mustBeOnFuture = false;
protected int minutesStep = STEP_MINUTES_DEFAULT;
@Nullable
protected Date minDate;
@Nullable
protected Date maxDate;
@Nullable
protected Date defaultDate;
protected boolean displayDays;
protected boolean displayMinutes;
protected boolean displayHours;
protected boolean displayMonth;
protected boolean displayYears;
protected boolean isBackgroundTranslucent = true;
@Nullable
protected Boolean isAmPm;
protected SimpleDateFormat dayFormatter;
public void display() {
this.isDisplaying = true;
}
public void close() {
this.isDisplaying = false;
}
public void dismiss() {
this.isDisplaying = false;
}
public boolean isDisplaying() {
return isDisplaying;
}
public void setBackgroundColor(@ColorInt Integer backgroundColor) {
this.backgroundColor = backgroundColor;
}
public void setMainColor(@ColorInt Integer mainColor) {
this.mainColor = mainColor;
}
public void setTitleTextColor(@NonNull @ColorInt int titleTextColor) {
this.titleTextColor = titleTextColor;
}
protected void onClose() {
this.isDisplaying = false;
}
}
package com.github.florent37.singledateandtimepicker.dialog;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import com.github.florent37.singledateandtimepicker.R;
import static android.content.Context.WINDOW_SERVICE;
public class BottomSheetHelper {
private Context context;
private int layoutId;
private View view;
private Listener listener;
private Handler handler;
private WindowManager windowManager;
public BottomSheetHelper(Context context, int layoutId) {
this.context = context;
this.layoutId = layoutId;
this.handler = new Handler(Looper.getMainLooper());
}
private void init() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (context instanceof Activity) {
windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
view = LayoutInflater.from(context).inflate(layoutId, null, true);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
// Shrink the window to wrap the content rather than filling the screen
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
// Don't let it grab the input focus
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
// Make the underlying application window visible through any transparent parts
PixelFormat.TRANSLUCENT);
if ((layoutParams.softInputMode
& WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
nl.copyFrom(layoutParams);
nl.softInputMode |= WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
layoutParams = nl;
}
windowManager.addView(view, layoutParams);
view.findViewById(R.id.bottom_sheet_background)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
hide();
}
});
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
view.getViewTreeObserver().removeOnPreDrawListener(this);
if (listener != null) {
listener.onLoaded(view);
}
return true;
}
});
}
}
}, 100);
}
public BottomSheetHelper setListener(Listener listener) {
this.listener = listener;
return this;
}
public void display() {
init();
handler.postDelayed(new Runnable() {
@Override
public void run() {
final ObjectAnimator objectAnimator =
ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, view.getHeight(), 0);
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (listener != null) {
listener.onOpen();
}
}
});
objectAnimator.start();
}
}, 200);
}
public void hide() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
final ObjectAnimator objectAnimator =
ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, 0, view.getHeight());
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
if (listener != null) {
listener.onClose();
}
remove();
}
});
objectAnimator.start();
}
}, 200);
}
public void dismiss(){
remove();
}
private void remove() {
if (view.getWindowToken() != null) windowManager.removeView(view);
}
public interface Listener {
void onOpen();
void onLoaded(View view);
void onClose();
}
}
package com.github.florent37.singledateandtimepicker.dialog;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.StateListDrawable;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.TextView;
import com.github.florent37.singledateandtimepicker.R;
import com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.STEP_MINUTES_DEFAULT;
public class DoubleDateAndTimePickerDialog extends BaseDialog {
private Listener listener;
private BottomSheetHelper bottomSheetHelper;
private TextView buttonTab0;
private TextView buttonTab1;
private SingleDateAndTimePicker pickerTab0;
private SingleDateAndTimePicker pickerTab1;
private View tab0;
private View tab1;
@Nullable
private String tab0Text, tab1Text, title;
@Nullable
private String todayText;
@Nullable
private String buttonOkText;
@Nullable
private Date tab0Date;
@Nullable
private Date tab1Date;
private boolean secondDateAfterFirst;
private DoubleDateAndTimePickerDialog(Context context) {
this(context, false);
}
private DoubleDateAndTimePickerDialog(Context context, boolean bottomSheet) {
final int layout = bottomSheet ? R.layout.bottom_sheet_double_picker_bottom_sheet :
R.layout.bottom_sheet_double_picker;
this.bottomSheetHelper = new BottomSheetHelper(context, layout);
this.bottomSheetHelper.setListener(new BottomSheetHelper.Listener() {
@Override
public void onOpen() {
}
@Override
public void onLoaded(View view) {
init(view);
}
@Override
public void onClose() {
DoubleDateAndTimePickerDialog.this.onClose();
}
});
}
private void init(View view) {
buttonTab0 = (TextView) view.findViewById(R.id.buttonTab0);
buttonTab1 = (TextView) view.findViewById(R.id.buttonTab1);
pickerTab0 = (SingleDateAndTimePicker) view.findViewById(R.id.picker_tab_0);
pickerTab1 = (SingleDateAndTimePicker) view.findViewById(R.id.picker_tab_1);
tab0 = view.findViewById(R.id.tab0);
tab1 = view.findViewById(R.id.tab1);
final View titleLayout = view.findViewById(R.id.sheetTitleLayout);
final TextView titleTextView = (TextView) view.findViewById(R.id.sheetTitle);
if(title != null) {
if (titleTextView != null) {
titleTextView.setText(title);
if (titleTextColor != null) {
titleTextView.setTextColor(titleTextColor);
}
}
if (mainColor != null && titleLayout != null) {
titleLayout.setBackgroundColor(mainColor);
}
}
else {
titleLayout.setVisibility(View.GONE);
}
pickerTab0.setTodayText(todayText);
pickerTab1.setTodayText(todayText);
final View sheetContentLayout = view.findViewById(R.id.sheetContentLayout);
if (sheetContentLayout != null) {
sheetContentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
if (backgroundColor != null) {
sheetContentLayout.setBackgroundColor(backgroundColor);
}
}
tab1.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
tab1.getViewTreeObserver().removeOnPreDrawListener(this);
tab1.setTranslationX(tab1.getWidth());
return false;
}
});
buttonTab0.setSelected(true);
if (tab0Text != null) {
buttonTab0.setText(tab0Text);
}
buttonTab0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
displayTab0();
}
});
if (tab1Text != null) {
buttonTab1.setText(tab1Text);
}
buttonTab1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
displayTab1();
}
});
//noinspection deprecation
buttonTab0.setBackgroundDrawable(getTabsListDrawable());
//noinspection deprecation
buttonTab1.setBackgroundDrawable(getTabsListDrawable());
final TextView buttonOk = (TextView) view.findViewById(R.id.buttonOk);
if (buttonOk != null) {
if (buttonOkText != null) {
buttonOk.setText(buttonOkText);
}
if (mainColor != null) {
buttonOk.setTextColor(mainColor);
}
}
buttonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isTab0Visible()) {
displayTab1();
} else {
okClicked = true;
close();
}
}
});
if (curved) {
pickerTab0.setCurved(true);
pickerTab1.setCurved(true);
pickerTab0.setVisibleItemCount(DEFAULT_ITEM_COUNT_MODE_CURVED);
pickerTab1.setVisibleItemCount(DEFAULT_ITEM_COUNT_MODE_CURVED);
} else {
pickerTab0.setCurved(false);
pickerTab1.setCurved(false);
pickerTab0.setVisibleItemCount(DEFAULT_ITEM_COUNT_MODE_NORMAL);
pickerTab1.setVisibleItemCount(DEFAULT_ITEM_COUNT_MODE_NORMAL);
}
pickerTab0.setMustBeOnFuture(mustBeOnFuture);
pickerTab1.setMustBeOnFuture(mustBeOnFuture);
pickerTab0.setStepMinutes(minutesStep);
pickerTab1.setStepMinutes(minutesStep);
if (mainColor != null) {
pickerTab0.setSelectedTextColor(mainColor);
pickerTab1.setSelectedTextColor(mainColor);
}
if (minDate != null) {
pickerTab0.setMinDate(minDate);
pickerTab1.setMinDate(minDate);
}
if (maxDate != null) {
pickerTab0.setMaxDate(maxDate);
pickerTab1.setMaxDate(maxDate);
}
if (defaultDate != null) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(defaultDate);
pickerTab0.selectDate(calendar);
pickerTab1.selectDate(calendar);
}
if (tab0Date != null) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(tab0Date);
pickerTab0.selectDate(calendar);
}
if (tab1Date != null) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(tab1Date);
pickerTab1.selectDate(calendar);
}
if (dayFormatter != null) {
pickerTab0.setDayFormatter(dayFormatter);
pickerTab1.setDayFormatter(dayFormatter);
}
if (secondDateAfterFirst) {
pickerTab0.addOnDateChangedListener(new SingleDateAndTimePicker.OnDateChangedListener() {
@Override
public void onDateChanged(String displayed, Date date) {
pickerTab1.setMinDate(date);
pickerTab1.checkPickersMinMax();
}
});
}
}
@NonNull
private StateListDrawable getTabsListDrawable() {
final StateListDrawable colorState0 = new StateListDrawable();
colorState0.addState(new int[] {android.R.attr.state_selected}, new ColorDrawable(mainColor));
colorState0.addState(new int[] {-android.R.attr.state_selected}, new ColorDrawable(backgroundColor));
return colorState0;
}
public DoubleDateAndTimePickerDialog setTab0Text(String tab0Text) {
this.tab0Text = tab0Text;
return this;
}
public DoubleDateAndTimePickerDialog setTab1Text(String tab1Text) {
this.tab1Text = tab1Text;
return this;
}
public DoubleDateAndTimePickerDialog setButtonOkText(@Nullable String buttonOkText) {
this.buttonOkText = buttonOkText;
return this;
}
public DoubleDateAndTimePickerDialog setTitle(@Nullable String title) {
this.title = title;
return this;
}
public DoubleDateAndTimePickerDialog setTodayText(@Nullable String todayText) {
this.todayText = todayText;
return this;
}
public DoubleDateAndTimePickerDialog setListener(Listener listener) {
this.listener = listener;
return this;
}
public DoubleDateAndTimePickerDialog setCurved(boolean curved) {
this.curved = curved;
return this;
}
public DoubleDateAndTimePickerDialog setMinutesStep(int minutesStep) {
this.minutesStep = minutesStep;
return this;
}
public DoubleDateAndTimePickerDialog setMustBeOnFuture(boolean mustBeOnFuture) {
this.mustBeOnFuture = mustBeOnFuture;
return this;
}
public DoubleDateAndTimePickerDialog setMinDateRange(Date minDate) {
this.minDate = minDate;
return this;
}
public DoubleDateAndTimePickerDialog setMaxDateRange(Date maxDate) {
this.maxDate = maxDate;
return this;
}
public DoubleDateAndTimePickerDialog setDefaultDate(Date defaultDate) {
this.defaultDate = defaultDate;
return this;
}
public DoubleDateAndTimePickerDialog setDayFormatter(SimpleDateFormat dayFormatter) {
this.dayFormatter = dayFormatter;
return this;
}
public DoubleDateAndTimePickerDialog setTab0Date(Date tab0Date) {
this.tab0Date = tab0Date;
return this;
}
public DoubleDateAndTimePickerDialog setTab1Date(Date tab1Date) {
this.tab1Date = tab1Date;
return this;
}
public DoubleDateAndTimePickerDialog setSecondDateAfterFirst(boolean secondDateAfterFirst) {
this.secondDateAfterFirst = secondDateAfterFirst;
return this;
}
@Override
public void display() {
super.display();
this.bottomSheetHelper.display();
}
@Override
public void dismiss(){
super.dismiss();
bottomSheetHelper.dismiss();
}
@Override
public void close() {
super.close();
bottomSheetHelper.hide();
}
protected void onClose() {
super.onClose();
if (listener != null && okClicked) {
listener.onDateSelected(Arrays.asList(pickerTab0.getDate(), pickerTab1.getDate()));
}
}
private void displayTab0() {
if (!isTab0Visible()) {
buttonTab0.setSelected(true);
buttonTab1.setSelected(false);
tab0.animate().translationX(0);
tab1.animate().translationX(tab1.getWidth());
}
}
private void displayTab1() {
if (isTab0Visible()) {
buttonTab0.setSelected(false);
buttonTab1.setSelected(true);
tab0.animate().translationX(-tab0.getWidth());
tab1.animate().translationX(0);
}
}
private boolean isTab0Visible() {
return tab0.getTranslationX() == 0;
}
public interface Listener {
void onDateSelected(List<Date> dates);
}
public static class Builder {
private final Context context;
@Nullable
private DoubleDateAndTimePickerDialog.Listener listener;
private boolean bottomSheet;
private DoubleDateAndTimePickerDialog dialog;
@Nullable
private String tab0Text;
@Nullable
private String tab1Text;
@Nullable
private String title;
@Nullable
private String buttonOkText;
@Nullable
private String todayText;
private boolean curved;
private boolean secondDateAfterFirst;
private boolean mustBeOnFuture;
private int minutesStep = STEP_MINUTES_DEFAULT;
private SimpleDateFormat dayFormatter;
@ColorInt
@Nullable
private Integer backgroundColor = null;
@ColorInt
@Nullable
private Integer mainColor = null;
@ColorInt
@Nullable
private Integer titleTextColor = null;
@Nullable
private Date minDate;
@Nullable
private Date maxDate;
@Nullable
private Date defaultDate;
@Nullable
private Date tab0Date;
@Nullable
private Date tab1Date;
public Builder(Context context) {
this.context = context;
}
public DoubleDateAndTimePickerDialog.Builder title(@Nullable String title) {
this.title = title;
return this;
}
public DoubleDateAndTimePickerDialog.Builder todayText(@Nullable String todayText) {
this.todayText = todayText;
return this;
}
public DoubleDateAndTimePickerDialog.Builder bottomSheet() {
this.bottomSheet = true;
return this;
}
public DoubleDateAndTimePickerDialog.Builder curved() {
this.curved = true;
return this;
}
public DoubleDateAndTimePickerDialog.Builder mustBeOnFuture() {
this.mustBeOnFuture = true;
return this;
}
public DoubleDateAndTimePickerDialog.Builder dayFormatter(SimpleDateFormat dayFormatter) {
this.dayFormatter = dayFormatter;
return this;
}
public DoubleDateAndTimePickerDialog.Builder minutesStep(int minutesStep) {
this.minutesStep = minutesStep;
return this;
}
public DoubleDateAndTimePickerDialog.Builder titleTextColor(@NonNull @ColorInt int titleTextColor) {
this.titleTextColor = titleTextColor;
return this;
}
public DoubleDateAndTimePickerDialog.Builder backgroundColor(@NonNull @ColorInt int backgroundColor) {
this.backgroundColor = backgroundColor;
return this;
}
public DoubleDateAndTimePickerDialog.Builder mainColor(@NonNull @ColorInt int mainColor) {
this.mainColor = mainColor;
return this;
}
public DoubleDateAndTimePickerDialog.Builder minDateRange(Date minDate) {
this.minDate = minDate;
return this;
}
public DoubleDateAndTimePickerDialog.Builder maxDateRange(Date maxDate) {
this.maxDate = maxDate;
return this;
}
public DoubleDateAndTimePickerDialog.Builder defaultDate(Date defaultDate) {
this.defaultDate = defaultDate;
return this;
}
public DoubleDateAndTimePickerDialog.Builder tab0Date(Date tab0Date) {
this.tab0Date = tab0Date;
return this;
}
public DoubleDateAndTimePickerDialog.Builder tab1Date(Date tab1Date) {
this.tab1Date = tab1Date;
return this;
}
public DoubleDateAndTimePickerDialog.Builder listener(
@Nullable DoubleDateAndTimePickerDialog.Listener listener) {
this.listener = listener;
return this;
}
public DoubleDateAndTimePickerDialog.Builder tab1Text(@Nullable String tab1Text) {
this.tab1Text = tab1Text;
return this;
}
public DoubleDateAndTimePickerDialog.Builder tab0Text(@Nullable String tab0Text) {
this.tab0Text = tab0Text;
return this;
}
public DoubleDateAndTimePickerDialog.Builder buttonOkText(@Nullable String buttonOkText) {
this.buttonOkText = buttonOkText;
return this;
}
public DoubleDateAndTimePickerDialog.Builder secondDateAfterFirst(boolean secondDateAfterFirst) {
this.secondDateAfterFirst = secondDateAfterFirst;
return this;
}
public DoubleDateAndTimePickerDialog build() {
final DoubleDateAndTimePickerDialog dialog = new DoubleDateAndTimePickerDialog(context, bottomSheet)
.setTitle(title)
.setTodayText(todayText)
.setListener(listener)
.setCurved(curved)
.setButtonOkText(buttonOkText)
.setTab0Text(tab0Text)
.setTab1Text(tab1Text)
.setMinutesStep(minutesStep)
.setMaxDateRange(maxDate)
.setMinDateRange(minDate)
.setDefaultDate(defaultDate)
.setTab0Date(tab0Date)
.setTab1Date(tab1Date)
.setDayFormatter(dayFormatter)
.setMustBeOnFuture(mustBeOnFuture)
.setSecondDateAfterFirst(secondDateAfterFirst);
if (mainColor != null) {
dialog.setMainColor(mainColor);
}
if (backgroundColor != null) {
dialog.setBackgroundColor(backgroundColor);
}
if (titleTextColor != null) {
dialog.setTitleTextColor(titleTextColor);
}
return dialog;
}
public void display() {
dialog = build();
dialog.display();
}
public void close() {
if (dialog != null) {
dialog.close();
}
}
public void dismiss(){
if(dialog!=null)
dialog.dismiss();
}
}
}
package com.github.florent37.singledateandtimepicker.dialog;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import com.github.florent37.singledateandtimepicker.R;
import com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.STEP_MINUTES_DEFAULT;
public class SingleDateAndTimePickerDialog extends BaseDialog {
private Listener listener;
private BottomSheetHelper bottomSheetHelper;
private SingleDateAndTimePicker picker;
@Nullable
private String title;
@Nullable
private String todayText;
@Nullable
private DisplayListener displayListener;
private TextView mTxtTime;
private SingleDateAndTimePickerDialog(Context context) {
this(context, false);
}
private SingleDateAndTimePickerDialog(Context context, boolean bottomSheet) {
final int layout =
bottomSheet ? R.layout.bottom_sheet_picker_bottom_sheet : R.layout.bottom_sheet_picker;
this.bottomSheetHelper = new BottomSheetHelper(context, layout);
this.bottomSheetHelper.setListener(new BottomSheetHelper.Listener() {
@Override
public void onOpen() {
}
@Override
public void onLoaded(View view) {
init(view);
if (displayListener != null) {
displayListener.onDisplayed(picker);
}
}
@Override
public void onClose() {
SingleDateAndTimePickerDialog.this.onClose();
if (displayListener != null) {
displayListener.onDismiss();
}
}
});
}
private void init(View view) {
picker = (SingleDateAndTimePicker) view.findViewById(R.id.picker);
final TextView buttonOk = (TextView) view.findViewById(R.id.buttonOk);
if (buttonOk != null) {
buttonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
okClicked = true;
close();
}
});
if (mainColor != null) {
buttonOk.setTextColor(mainColor);
}
}
if (isBackgroundTranslucent) {
view.setBackgroundColor(Color.parseColor("#33000000"));
} else {
view.setBackgroundColor(Color.parseColor("#00000000"));
}
final View sheetContentLayout = view.findViewById(R.id.sheetContentLayout);
if (sheetContentLayout != null) {
sheetContentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
if (backgroundColor != null) {
sheetContentLayout.setBackgroundColor(backgroundColor);
}
}
final TextView titleTextView = (TextView) view.findViewById(R.id.sheetTitle);
if (titleTextView != null) {
titleTextView.setText(title);
if (titleTextColor != null) {
titleTextView.setTextColor(titleTextColor);
}
}
mTxtTime = (TextView) view.findViewById(R.id.tv_time);
if (mainColor != null) {
mTxtTime.setTextColor(mainColor);
}
titleTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.dismiss();
}
}
});
picker.setTodayText(todayText);
final View pickerTitleHeader = view.findViewById(R.id.pickerTitleHeader);
if (mainColor != null && pickerTitleHeader != null) {
pickerTitleHeader.setBackgroundColor(mainColor);
}
if (curved) {
picker.setCurved(true);
picker.setVisibleItemCount(7);
} else {
picker.setCurved(false);
picker.setVisibleItemCount(5);
}
picker.setMustBeOnFuture(mustBeOnFuture);
picker.setStepMinutes(minutesStep);
if (dayFormatter != null) {
picker.setDayFormatter(dayFormatter);
}
if (mainColor != null) {
picker.setSelectedTextColor(mainColor);
}
if (minDate != null) {
picker.setMinDate(minDate);
}
if (maxDate != null) {
picker.setMaxDate(maxDate);
}
if (defaultDate != null) {
picker.setDefaultDate(defaultDate);
}
if (isAmPm != null) {
picker.setIsAmPm(isAmPm);
}
picker.setDisplayDays(displayDays);
picker.setDisplayMinutes(displayMinutes);
picker.setDisplayHours(displayHours);
}
public SingleDateAndTimePickerDialog setListener(Listener listener) {
this.listener = listener;
return this;
}
public SingleDateAndTimePickerDialog setCurved(boolean curved) {
this.curved = curved;
return this;
}
public SingleDateAndTimePickerDialog setMinutesStep(int minutesStep) {
this.minutesStep = minutesStep;
return this;
}
private void setDisplayListener(DisplayListener displayListener) {
this.displayListener = displayListener;
}
public SingleDateAndTimePickerDialog setTitle(@Nullable String title) {
this.title = title;
return this;
}
public SingleDateAndTimePickerDialog setTodayText(@Nullable String todayText) {
this.todayText = todayText;
return this;
}
public SingleDateAndTimePickerDialog setMustBeOnFuture(boolean mustBeOnFuture) {
this.mustBeOnFuture = mustBeOnFuture;
return this;
}
public SingleDateAndTimePickerDialog setMinDateRange(Date minDate) {
this.minDate = minDate;
return this;
}
public SingleDateAndTimePickerDialog setMaxDateRange(Date maxDate) {
this.maxDate = maxDate;
return this;
}
public SingleDateAndTimePickerDialog setDefaultDate(Date defaultDate) {
this.defaultDate = defaultDate;
return this;
}
public SingleDateAndTimePickerDialog setDisplayDays(boolean displayDays) {
this.displayDays = displayDays;
return this;
}
public SingleDateAndTimePickerDialog setDisplayMinutes(boolean displayMinutes) {
this.displayMinutes = displayMinutes;
return this;
}
public SingleDateAndTimePickerDialog setDisplayHours(boolean displayHours) {
this.displayHours = displayHours;
return this;
}
private SingleDateAndTimePickerDialog setDisplayMonth(boolean displayMonth) {
this.displayMonth = displayMonth;
return this;
}
private SingleDateAndTimePickerDialog setDisplayYears(boolean displayYears) {
this.displayYears = displayYears;
return this;
}
private SingleDateAndTimePickerDialog setBackgroundTranslucent(boolean isBackgroundTranslucent) {
this.isBackgroundTranslucent = isBackgroundTranslucent;
return this;
}
public SingleDateAndTimePickerDialog setDayFormatter(SimpleDateFormat dayFormatter) {
this.dayFormatter = dayFormatter;
return this;
}
public SingleDateAndTimePickerDialog setIsAmPm(boolean isAmPm) {
this.isAmPm = Boolean.valueOf(isAmPm);
return this;
}
@Override
public void display() {
super.display();
bottomSheetHelper.display();
}
@Override
public void close() {
super.close();
bottomSheetHelper.hide();
if (listener != null && okClicked) {
listener.onDateSelected(picker.getDate());
}
}
@Override
public void dismiss() {
super.dismiss();
bottomSheetHelper.dismiss();
}
public void setTxtTime(String time) {
if (mTxtTime == null)
return;
if (!TextUtils.isEmpty(time)) {
mTxtTime.setText(time);
mTxtTime.setVisibility(View.VISIBLE);
} else {
mTxtTime.setText("");
mTxtTime.setVisibility(View.GONE);
}
}
public interface Listener {
void onDateSelected(Date date);
void dismiss();
}
public interface DisplayListener {
void onDisplayed(SingleDateAndTimePicker picker);
void onDismiss();
}
public static class Builder {
private final Context context;
private SingleDateAndTimePickerDialog dialog;
@Nullable
private Listener listener;
@Nullable
private DisplayListener displayListener;
@Nullable
private String title;
@Nullable
private String todayText;
private boolean bottomSheet;
private boolean curved;
private boolean mustBeOnFuture;
private int minutesStep = STEP_MINUTES_DEFAULT;
private boolean displayDays = true;
private boolean displayMinutes = true;
private boolean displayHours = true;
private boolean displayMonth = false;
private boolean displayYears = false;
private boolean isBackgroundTranslucent = true;
@Nullable
private Boolean isAmPm;
@ColorInt
@Nullable
private Integer backgroundColor = null;
@ColorInt
@Nullable
private Integer mainColor = null;
@ColorInt
@Nullable
private Integer titleTextColor = null;
@Nullable
private Date minDate;
@Nullable
private Date maxDate;
@Nullable
private Date defaultDate;
@Nullable
private SimpleDateFormat dayFormatter;
public Builder(Context context) {
this.context = context;
}
public Builder title(@Nullable String title) {
this.title = title;
return this;
}
public Builder todayText(@Nullable String todayText) {
this.todayText = todayText;
return this;
}
public Builder bottomSheet() {
this.bottomSheet = true;
return this;
}
public Builder curved() {
this.curved = true;
return this;
}
public Builder mustBeOnFuture() {
this.mustBeOnFuture = true;
return this;
}
public Builder minutesStep(int minutesStep) {
this.minutesStep = minutesStep;
return this;
}
public Builder displayDays(boolean displayDays) {
this.displayDays = displayDays;
return this;
}
public Builder displayAmPm(boolean isAmPm) {
this.isAmPm = isAmPm;
return this;
}
public Builder displayMinutes(boolean displayMinutes) {
this.displayMinutes = displayMinutes;
return this;
}
public Builder displayHours(boolean displayHours) {
this.displayHours = displayHours;
return this;
}
public Builder displayMonth(boolean displayMonth) {
this.displayMonth = displayMonth;
return this;
}
public Builder displayYears(boolean displayYears) {
this.displayYears = displayYears;
return this;
}
public Builder backgroundTranslucent(boolean isBackgroundTranslucent) {
this.isBackgroundTranslucent = isBackgroundTranslucent;
return this;
}
public Builder listener(@Nullable Listener listener) {
this.listener = listener;
return this;
}
public Builder displayListener(@Nullable DisplayListener displayListener) {
this.displayListener = displayListener;
return this;
}
public Builder titleTextColor(@NonNull @ColorInt int titleTextColor) {
this.titleTextColor = titleTextColor;
return this;
}
public Builder backgroundColor(@NonNull @ColorInt int backgroundColor) {
this.backgroundColor = backgroundColor;
return this;
}
public Builder mainColor(@NonNull @ColorInt int mainColor) {
this.mainColor = mainColor;
return this;
}
public Builder minDateRange(Date minDate) {
this.minDate = minDate;
return this;
}
public Builder maxDateRange(Date maxDate) {
this.maxDate = maxDate;
return this;
}
public Builder defaultDate(Date defaultDate) {
this.defaultDate = defaultDate;
return this;
}
public Builder setDayFormatter(SimpleDateFormat dayFormatter) {
this.dayFormatter = dayFormatter;
return this;
}
public SingleDateAndTimePickerDialog build() {
final SingleDateAndTimePickerDialog dialog =
new SingleDateAndTimePickerDialog(context, bottomSheet).setTitle(title)
.setTodayText(todayText).setListener(listener).setCurved(curved)
.setMinutesStep(minutesStep).setMaxDateRange(maxDate).setMinDateRange(minDate)
.setDefaultDate(defaultDate).setDisplayHours(displayHours)
.setDisplayMonth(displayMonth).setDisplayYears(displayYears)
.setBackgroundTranslucent(isBackgroundTranslucent)
.setDisplayMinutes(displayMinutes).setDisplayDays(displayDays)
.setDayFormatter(dayFormatter).setMustBeOnFuture(mustBeOnFuture);
if (mainColor != null) {
dialog.setMainColor(mainColor);
}
if (backgroundColor != null) {
dialog.setBackgroundColor(backgroundColor);
}
if (titleTextColor != null) {
dialog.setTitleTextColor(titleTextColor);
}
if (displayListener != null) {
dialog.setDisplayListener(displayListener);
}
if (isAmPm != null) {
dialog.setIsAmPm(isAmPm);
}
return dialog;
}
public void display() {
dialog = build();
dialog.display();
}
public void close() {
if (dialog != null) {
dialog.close();
}
}
public void dismiss() {
if (dialog != null) dialog.dismiss();
}
public void setTxtTime(String time) {
if (dialog != null) {
dialog.setTxtTime(time);
}
}
}
}
package com.github.florent37.singledateandtimepicker.widget;
public class SingleDateAndTimeConstants {
public static final int MIN_HOUR_DEFAULT = 0;
public static final int MAX_HOUR_DEFAULT = 23;
public static final int MAX_HOUR_AM_PM = 12;
public static final int STEP_HOURS_DEFAULT = 1;
public static final int DAYS_PADDING = 364;
public static final int MIN_MINUTES = 0;
public static final int MAX_MINUTES = 59;
public static final int STEP_MINUTES_DEFAULT = 5;
}
package com.github.florent37.singledateandtimepicker.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import com.github.florent37.singledateandtimepicker.DateHelper;
import com.github.florent37.singledateandtimepicker.R;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class WheelAmPmPicker extends WheelPicker<String> {
public static final int INDEX_AM = 0;
public static final int INDEX_PM = 1;
@Nullable
private AmPmListener amPmListener;
public WheelAmPmPicker(Context context) {
super(context);
}
public WheelAmPmPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void init() {
}
@Override
protected String initDefault() {
if (DateHelper.getHour(DateHelper.today(), true) >= SingleDateAndTimeConstants.MAX_HOUR_AM_PM) {
return getContext().getString(R.string.picker_pm);
} else {
return getContext().getString(R.string.picker_am);
}
}
@Override
protected List<String> generateAdapterValues(){
return Arrays.asList(
getContext().getString(R.string.picker_am),
getContext().getString(R.string.picker_pm)
);
}
@Override
public int findIndexOfDate(@NonNull Date date) {
final int hours = date.getHours();
if (hours >= SingleDateAndTimeConstants.MAX_HOUR_AM_PM) {
return 1;
} else {
return 0;
}
}
public void setAmPmListener(@Nullable AmPmListener amPmListener) {
this.amPmListener = amPmListener;
}
@Override
protected void onItemSelected(int position, String item) {
super.onItemSelected(position, item);
if (amPmListener != null) {
amPmListener.onAmPmChanged(this, isAm());
}
}
@Override
public void setCyclic(boolean isCyclic) {
super.setCyclic(false);
}
public boolean isAmPosition(int position) {
return position == INDEX_AM;
}
@Override
protected String getFormattedValue(Object value) {
if (value instanceof Date) {
Calendar instance = Calendar.getInstance();
instance.setTime((Date) value);
return getResources().getString(instance.get(Calendar.AM_PM) == Calendar.PM ? R.string.picker_pm : R.string.picker_am);
}
return String.valueOf(value);
}
public boolean isAm() {
return getCurrentItemPosition() == INDEX_AM;
}
public boolean isPm() {
return getCurrentItemPosition() == INDEX_PM;
}
public interface AmPmListener {
void onAmPmChanged(WheelAmPmPicker pmPicker, boolean isAm);
}
}
\ No newline at end of file
package com.github.florent37.singledateandtimepicker.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import com.github.florent37.singledateandtimepicker.DateHelper;
import com.github.florent37.singledateandtimepicker.R;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.DAYS_PADDING;
public class WheelDayPicker extends WheelPicker<String> {
private SimpleDateFormat simpleDateFormat;
private OnDaySelectedListener onDaySelectedListener;
public WheelDayPicker(Context context) {
super(context);
}
public WheelDayPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void init() {
simpleDateFormat = new SimpleDateFormat("MMM d EEE", getCurrentLocale());
}
@Override
protected String initDefault() {
return getTodayText();
}
@NonNull
private String getTodayText() {
return getResources().getString(R.string.picker_today);
}
public WheelDayPicker setDayFormatter(SimpleDateFormat simpleDateFormat){
this.simpleDateFormat = simpleDateFormat;
adapter.setData(generateAdapterValues());
notifyDatasetChanged();
return this;
}
@Override
protected void onItemSelected(int position, String item) {
if (onDaySelectedListener != null) {
final Date date = convertItemToDate(position);
onDaySelectedListener.onDaySelected(this, position, item, date);
}
}
@Override
protected List<String> generateAdapterValues() {
final List<String> days = new ArrayList<>();
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, -1 * DAYS_PADDING - 1);
for (int i = (-1) * DAYS_PADDING; i < 0; ++i) {
instance.add(Calendar.DAY_OF_MONTH, 1);
days.add(getFormattedValue(instance.getTime()));
}
//today
days.add(getTodayText());
instance = Calendar.getInstance();
for (int i = 0; i < DAYS_PADDING; ++i) {
instance.add(Calendar.DATE, 1);
days.add(getFormattedValue(instance.getTime()));
}
return days;
}
protected String getFormattedValue(Object value) {
return simpleDateFormat.format(value);
}
public void setOnDaySelectedListener(OnDaySelectedListener onDaySelectedListener) {
this.onDaySelectedListener = onDaySelectedListener;
}
public Date getCurrentDate() {
return convertItemToDate(super.getCurrentItemPosition());
}
private Date convertItemToDate(int itemPosition) {
Date date = null;
final String itemText = adapter.getItemText(itemPosition);
final Calendar todayCalendar = Calendar.getInstance();
final int todayPosition = adapter.getData().indexOf(getTodayText());
if (getTodayText().equals(itemText)) {
date = todayCalendar.getTime();
} else {
try {
date = simpleDateFormat.parse(itemText);
} catch (ParseException e) {
e.printStackTrace();
}
}
if (date != null) {
//try to know the year
final Calendar dateCalendar = DateHelper.getCalendarOfDate(date);
todayCalendar.add(Calendar.DATE, (itemPosition - todayPosition));
dateCalendar.set(Calendar.YEAR, todayCalendar.get(Calendar.YEAR));
date = dateCalendar.getTime();
}
return date;
}
public void setTodayText(String todayText) {
int index = adapter.getData().indexOf(getTodayText());
if (index != -1) {
adapter.getData().set(index, todayText);
notifyDatasetChanged();
}
}
public interface OnDaySelectedListener {
void onDaySelected(WheelDayPicker picker, int position, String name, Date date);
}
}
\ No newline at end of file
package com.github.florent37.singledateandtimepicker.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static com.github.florent37.singledateandtimepicker.DateHelper.getHour;
import static com.github.florent37.singledateandtimepicker.DateHelper.today;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.MAX_HOUR_AM_PM;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.MAX_HOUR_DEFAULT;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.MIN_HOUR_DEFAULT;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.STEP_HOURS_DEFAULT;
public class WheelHourPicker extends WheelPicker<String> {
private int minHour;
private int maxHour;
private int hoursStep;
protected boolean isAmPm;
private FinishedLoopListener finishedLoopListener;
private OnHourChangedListener hourChangedListener;
public WheelHourPicker(Context context) {
super(context);
}
public WheelHourPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void init() {
isAmPm = false;
minHour = MIN_HOUR_DEFAULT;
maxHour = MAX_HOUR_DEFAULT;
hoursStep = STEP_HOURS_DEFAULT;
}
@Override
protected String initDefault() {
return String.valueOf(getHour(today(), isAmPm));
}
@Override
protected List<String> generateAdapterValues() {
final List<String> hours = new ArrayList<>();
if (isAmPm) {
hours.add(getFormattedValue(12));
for (int hour = hoursStep; hour < maxHour; hour += hoursStep) {
hours.add(getFormattedValue(hour));
}
} else {
for (int hour = minHour; hour <= maxHour; hour += hoursStep) {
hours.add(getFormattedValue(hour));
}
}
return hours;
}
@Override
public int findIndexOfDate(@NonNull Date date) {
if (isAmPm) {
final int hours = date.getHours();
if (hours >= MAX_HOUR_AM_PM) {
Date copy = new Date(date.getTime());
copy.setHours(hours % MAX_HOUR_AM_PM);
return super.findIndexOfDate(copy);
}
}
return super.findIndexOfDate(date);
}
protected String getFormattedValue(Object value) {
Object valueItem = value;
if (value instanceof Date) {
Calendar instance = Calendar.getInstance();
instance.setTime((Date) value);
valueItem = instance.get(Calendar.HOUR_OF_DAY);
}
return String.format(getCurrentLocale(), FORMAT, valueItem);
}
@Override
public void setDefault(String defaultValue) {
try {
int hour = Integer.parseInt(defaultValue);
if (isAmPm && hour >= MAX_HOUR_AM_PM) {
hour -= MAX_HOUR_AM_PM;
}
super.setDefault(getFormattedValue(hour));
} catch (Exception e){
e.printStackTrace();
}
}
public void setIsAmPm(boolean isAmPm) {
this.isAmPm = isAmPm;
if (isAmPm) {
setMaxHour(MAX_HOUR_AM_PM);
} else {
setMaxHour(MAX_HOUR_DEFAULT);
}
updateAdapter();
}
public void setMaxHour(int maxHour) {
if (maxHour >= MIN_HOUR_DEFAULT && maxHour <= MAX_HOUR_DEFAULT) {
this.maxHour = maxHour;
}
notifyDatasetChanged();
}
public void setMinHour(int minHour) {
if (minHour >= MIN_HOUR_DEFAULT && minHour <= MAX_HOUR_DEFAULT) {
this.minHour = minHour;
}
notifyDatasetChanged();
}
public void setHoursStep(int hoursStep) {
if (hoursStep >= MIN_HOUR_DEFAULT && hoursStep <= MAX_HOUR_DEFAULT) {
this.hoursStep = hoursStep;
}
notifyDatasetChanged();
}
private int convertItemToHour(Object item) {
Integer hour = Integer.valueOf(String.valueOf(item));
if (!isAmPm) {
return hour;
}
if (hour == 12) {
hour = 0;
}
return hour;
}
public int getCurrentHour() {
return convertItemToHour(adapter.getItem(getCurrentItemPosition()));
}
@Override
protected void onItemSelected(int position, String item) {
super.onItemSelected(position, item);
if (hourChangedListener != null) {
hourChangedListener.onHourChanged(this, convertItemToHour(item));
}
}
public WheelHourPicker setOnFinishedLoopListener(FinishedLoopListener finishedLoopListener) {
this.finishedLoopListener = finishedLoopListener;
return this;
}
public WheelHourPicker setHourChangedListener(OnHourChangedListener hourChangedListener) {
this.hourChangedListener = hourChangedListener;
return this;
}
@Override
protected void onFinishedLoop() {
super.onFinishedLoop();
if (finishedLoopListener != null) {
finishedLoopListener.onFinishedLoop(this);
}
}
public interface FinishedLoopListener {
void onFinishedLoop(WheelHourPicker picker);
}
public interface OnHourChangedListener {
void onHourChanged(WheelHourPicker picker, int hour);
}
}
\ No newline at end of file
package com.github.florent37.singledateandtimepicker.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import com.github.florent37.singledateandtimepicker.DateHelper;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.MAX_MINUTES;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.MIN_MINUTES;
import static com.github.florent37.singledateandtimepicker.widget.SingleDateAndTimeConstants.STEP_MINUTES_DEFAULT;
public class WheelMinutePicker extends WheelPicker<String> {
private int stepMinutes;
private OnMinuteChangedListener onMinuteChangedListener;
private OnFinishedLoopListener onFinishedLoopListener;
public WheelMinutePicker(Context context) {
super(context);
}
public WheelMinutePicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void init() {
stepMinutes = STEP_MINUTES_DEFAULT;
}
@Override
protected String initDefault() {
return getFormattedValue(Calendar.getInstance().get(Calendar.MINUTE));
}
@Override
protected List<String> generateAdapterValues() {
final List<String> minutes = new ArrayList<>();
for (int min = MIN_MINUTES; min <= MAX_MINUTES; min += stepMinutes) {
minutes.add(getFormattedValue(min));
}
return minutes;
}
private int findIndexOfMinute(int minute) {
final int itemCount = adapter.getItemCount();
for (int i = 0; i < itemCount; ++i) {
final String object = adapter.getItemText(i);
final Integer value = Integer.valueOf(object);
if (minute < value) {
return i - 1;
}
}
return 0;
}
@Override
public int findIndexOfDate(@NonNull Date date) {
return findIndexOfMinute(DateHelper.getMinuteOf(date));
}
protected String getFormattedValue(Object value) {
Object valueItem = value;
if (value instanceof Date) {
final Calendar instance = Calendar.getInstance();
instance.setTime((Date) value);
valueItem = instance.get(Calendar.MINUTE);
}
return String.format(getCurrentLocale(), FORMAT, valueItem);
}
public void setStepMinutes(int stepMinutes) {
if (stepMinutes < 60 && stepMinutes > 0) {
this.stepMinutes = stepMinutes;
updateAdapter();
}
}
private int convertItemToMinute(Object item) {
return Integer.valueOf(String.valueOf(item));
}
public int getCurrentMinute() {
return convertItemToMinute(adapter.getItem(getCurrentItemPosition()));
}
public WheelMinutePicker setOnMinuteChangedListener(OnMinuteChangedListener onMinuteChangedListener) {
this.onMinuteChangedListener = onMinuteChangedListener;
return this;
}
public WheelMinutePicker setOnFinishedLoopListener(OnFinishedLoopListener onFinishedLoopListener) {
this.onFinishedLoopListener = onFinishedLoopListener;
return this;
}
@Override
protected void onItemSelected(int position, String item) {
super.onItemSelected(position, item);
if (onMinuteChangedListener != null) {
onMinuteChangedListener.onMinuteChanged(this, convertItemToMinute(item));
}
}
@Override
protected void onFinishedLoop() {
super.onFinishedLoop();
if (onFinishedLoopListener != null) {
onFinishedLoopListener.onFinishedLoop(this);
}
}
public interface OnMinuteChangedListener {
void onMinuteChanged(WheelMinutePicker picker, int minutes);
}
public interface OnFinishedLoopListener {
void onFinishedLoop(WheelMinutePicker picker);
}
}
\ No newline at end of file
package com.github.florent37.singledateandtimepicker.widget;
import android.content.Context;
import android.util.AttributeSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import static com.github.florent37.singledateandtimepicker.DateHelper.getMonth;
import static com.github.florent37.singledateandtimepicker.DateHelper.today;
public class WheelMonthPicker extends WheelPicker<String> {
private int lastScrollPosition;
private MonthSelectedListener listener;
public WheelMonthPicker(Context context) {
this(context, null);
}
public WheelMonthPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void init() {
}
@Override
protected List<String> generateAdapterValues(){
final List<String> monthList = new ArrayList<>();
final SimpleDateFormat month_date = new SimpleDateFormat("MMMM", Locale.getDefault());
final Calendar cal = Calendar.getInstance(Locale.getDefault());
for (int i = 0; i < 12; i++) {
cal.set(Calendar.MONTH, i);
monthList.add(month_date.format(cal.getTime()));
}
return monthList;
}
@Override
protected String initDefault() {
return String.valueOf(getMonth(today()));
}
public void setListener(MonthSelectedListener listener) {
this.listener = listener;
}
@Override
protected void onItemSelected(int position, String item) {
if (listener != null) {
listener.onMonthSelected(this, position, item);
}
}
@Override
protected void onItemCurrentScroll(int position, String item) {
if (lastScrollPosition != position) {
onItemSelected(position, item);
lastScrollPosition = position;
}
}
private int convertItemToMinute(Object item) {
return Integer.valueOf(String.valueOf(item));
}
public int getCurrentMinute() {
return convertItemToMinute(adapter.getItem(getCurrentItemPosition()));
}
public interface MonthSelectedListener {
void onMonthSelected(WheelMonthPicker picker, int monthIndex, String monthName);
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:color="@color/picker_button_background_innactive"/>
<item android:color="@color/picker_button_background_selected"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@android:color/white"/>
<item android:color="@color/picker_button_background_innactive"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/picker_button_background_selected"/>
<item android:color="@color/picker_button_background"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@color/picker_background"/>
<item android:drawable="@android:color/white"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@color/picker_button_background"/>
<item android:drawable="@color/picker_button_background_innactive"/>
</selector>
\ No newline at end of file
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/sheetContentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@android:color/white"
android:elevation="4dp"
android:orientation="vertical"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp"
>
<TextView
android:id="@+id/sheetTitle"
android:minWidth="80dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start|center_vertical"
android:gravity="center"
android:layout_marginLeft="12dp"
android:background="?android:attr/selectableItemBackground"
android:text="title here"
android:textColor="@color/picker_button_background_selected"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tv_time"
android:minWidth="80dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center|center_vertical"
android:gravity="center"
android:background="?android:attr/selectableItemBackground"
android:textAllCaps="true"
android:textColor="@color/picker_button_background_selected"
android:textStyle="bold"
android:visibility="gone"
/>
<TextView
android:id="@+id/buttonOk"
android:minWidth="80dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end|center_vertical"
android:gravity="center"
android:background="?android:attr/selectableItemBackground"
android:text="@android:string/ok"
android:textAllCaps="true"
android:textColor="@color/picker_button_background_selected"
android:textStyle="bold"
/>
</FrameLayout>
<com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker
android:id="@+id/picker"
android:layout_width="match_parent"
android:layout_height="230dp"
android:layout_weight="1"
app:picker_curved="true"
app:picker_cyclic="true"
app:picker_selectedTextColor="@color/picker_button_background_selected"
app:picker_textSize="20sp"
app:picker_visibleItemCount="7"
/>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/bottom_sheet_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/sheetContentLayout"
android:layout_width="300dp"
android:layout_gravity="center"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:elevation="4dp"
android:orientation="vertical"
>
<FrameLayout
android:id="@+id/sheetTitleLayout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/picker_background"
>
<TextView
android:id="@+id/sheetTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="18sp"
android:text="The title"
android:textStyle="bold"
android:textColor="@android:color/white"
/>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
>
<Button
android:id="@+id/buttonTab0"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/double_date_picker_button_background_selector"
android:text="0"
android:textColor="@color/double_date_picker_button_text_selector"
/>
<Button
android:id="@+id/buttonTab1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/double_date_picker_button_background_selector"
android:text="1"
android:textColor="@color/double_date_picker_button_text_selector"
/>
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
>
<FrameLayout
android:id="@+id/tab0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker
android:id="@+id/picker_tab_0"
android:layout_width="match_parent"
android:layout_height="230dp"
android:layout_weight="1"
app:picker_curved="false"
app:picker_cyclic="true"
app:picker_textSize="20sp"
app:picker_visibleItemCount="5"
app:picker_selectedTextColor="@color/picker_background"
/>
</FrameLayout>
<FrameLayout
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker
android:id="@+id/picker_tab_1"
android:layout_width="match_parent"
android:layout_height="230dp"
app:picker_curved="false"
app:picker_cyclic="true"
app:picker_textSize="20sp"
app:picker_visibleItemCount="5"
app:picker_selectedTextColor="@color/picker_background"
/>
</FrameLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
>
<TextView
android:id="@+id/buttonOk"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right|center_vertical"
android:gravity="center"
android:background="?android:attr/selectableItemBackground"
android:paddingLeft="20dp"
android:paddingRight="25dp"
android:text="@android:string/ok"
android:textAllCaps="true"
android:textColor="@color/picker_background"
android:textStyle="bold"
/>
</FrameLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/sheetContentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@android:color/white"
android:elevation="4dp"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
>
<Button
android:id="@+id/buttonTab0"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/double_date_picker_button_background_selector_ios"
android:text="0"
android:textColor="@color/double_date_picker_button_text_selector_ios"
/>
<Button
android:id="@+id/buttonTab1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/double_date_picker_button_background_selector_ios"
android:text="1"
android:textColor="@color/double_date_picker_button_text_selector_ios"
/>
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<FrameLayout
android:id="@+id/tab0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker
android:id="@+id/picker_tab_0"
android:layout_width="match_parent"
android:layout_height="230dp"
android:layout_weight="1"
app:picker_curved="true"
app:picker_cyclic="true"
app:picker_textSize="20sp"
app:picker_visibleItemCount="7"
app:picker_selectedTextColor="@color/picker_button_background_selected"
/>
</FrameLayout>
<FrameLayout
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker
android:id="@+id/picker_tab_1"
android:layout_width="match_parent"
android:layout_height="230dp"
app:picker_curved="true"
app:picker_cyclic="true"
app:picker_textSize="20sp"
app:picker_visibleItemCount="7"
app:picker_selectedTextColor="@color/picker_button_background_selected"
/>
</FrameLayout>
</FrameLayout>
<Button
android:id="@+id/buttonOk"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:text="@android:string/ok"
android:background="?android:attr/selectableItemBackground"
android:textColor="@color/picker_button_background_selected"
/>
</LinearLayout>
</FrameLayout>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/sheetContentLayout"
android:layout_height="wrap_content"
android:layout_width="300dp"
android:layout_gravity="center"
android:background="@android:color/white"
android:elevation="4dp"
android:orientation="vertical"
>
<FrameLayout
android:id="@+id/pickerTitleHeader"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/picker_background"
android:layout_marginBottom="20dp"
>
<TextView
android:id="@+id/sheetTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="18sp"
android:text="The title"
android:textStyle="bold"
android:textColor="@android:color/white"
/>
</FrameLayout>
<com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker
android:id="@+id/picker"
android:layout_width="match_parent"
android:layout_height="230dp"
android:layout_weight="1"
app:picker_curved="false"
app:picker_cyclic="true"
app:picker_selectedTextColor="@color/picker_background"
app:picker_textSize="20sp"
app:picker_visibleItemCount="5"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
>
<TextView
android:id="@+id/buttonOk"
android:minWidth="80dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end|center_vertical"
android:gravity="center"
android:background="?android:attr/selectableItemBackground"
android:text="@android:string/ok"
android:textAllCaps="true"
android:textColor="@color/picker_background"
android:textStyle="bold"
/>
</FrameLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/sheetContentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@android:color/white"
android:elevation="4dp"
android:orientation="vertical"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#f7f7f7"
>
<TextView
android:id="@+id/sheetTitle"
android:minWidth="80dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start|center_vertical"
android:gravity="center"
android:background="?android:attr/selectableItemBackground"
android:text="title here"
android:layout_marginLeft="12dp"
android:textColor="@color/picker_button_background_selected"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tv_time"
android:minWidth="80dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center|center_vertical"
android:gravity="center"
android:background="?android:attr/selectableItemBackground"
android:textAllCaps="true"
android:textColor="@color/picker_button_background_selected"
android:textStyle="bold"
android:visibility="gone"
/>
<TextView
android:id="@+id/buttonOk"
android:minWidth="80dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end|center_vertical"
android:gravity="center"
android:background="?android:attr/selectableItemBackground"
android:text="@android:string/ok"
android:textAllCaps="true"
android:textColor="@color/picker_button_background_selected"
android:textStyle="bold"
/>
</FrameLayout>
<com.github.florent37.singledateandtimepicker.SingleDateAndTimePicker
android:id="@+id/picker"
android:layout_width="match_parent"
android:layout_height="230dp"
android:layout_weight="1"
app:picker_curved="true"
app:picker_cyclic="true"
app:picker_selectedTextColor="@color/picker_button_background_selected"
app:picker_textSize="20sp"
app:picker_visibleItemCount="7"
/>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:gravity="center"
android:orientation="horizontal"
>
<com.github.florent37.singledateandtimepicker.widget.WheelDayPicker
android:id="@+id/daysPicker"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:wheel_atmospheric="true"
app:wheel_item_align="right"
/>
<com.github.florent37.singledateandtimepicker.widget.WheelHourPicker
android:id="@+id/hoursPicker"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
app:wheel_atmospheric="true"
app:wheel_item_align="center"
/>
<com.github.florent37.singledateandtimepicker.widget.WheelMinutePicker
android:id="@+id/minutesPicker"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:wheel_atmospheric="true"
app:wheel_item_align="center"
/>
<com.github.florent37.singledateandtimepicker.widget.WheelAmPmPicker
android:id="@+id/amPmPicker"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:wheel_atmospheric="true"
app:wheel_item_align="center"
app:wheel_visible_item_count="2"
android:paddingLeft="30dp"
android:layout_marginRight="15dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="vertical"
android:layout_gravity="center_vertical"
>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#cdcdcd"
/>
<View
android:id="@+id/dtSelector"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:alpha="0.2"
android:background="@color/picker_default_selector_color"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#cdcdcd"
/>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">Dnes</string>
<string name="picker_am">dop.</string>
<string name="picker_pm">odp.</string>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">I dag</string>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">Heute</string>
<string name="picker_am">AM</string>
<string name="picker_pm">PM</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">hoy</string>
<string name="picker_pm">PM</string>
<string name="picker_am">A.M</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">aujourd\'hui</string>
<string name="picker_am">UN M</string>
<string name="picker_pm">PM</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">oggi</string>
<string name="picker_pm">PM</string>
<string name="picker_am">AM</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">Šiandien</string>
<string name="picker_pm">PM</string>
<string name="picker_am">AM</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">Сегодня</string>
<string name="picker_am">ДП</string>
<string name="picker_pm">ПП</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">bugün</string>
<string name="picker_am">AM</string>
<string name="picker_pm">PM</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">сьогодні</string>
<string name="picker_am">ДП</string>
<string name="picker_pm">ПП</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">今日</string>
<string name="picker_am">上午</string>
<string name="picker_pm">下午</string>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="WheelPicker">
<attr name="wheel_data" format="reference"/>
<attr name="wheel_selected_item_position" format="integer"/>
<attr name="wheel_item_text_size" format="dimension"/>
<attr name="wheel_item_text_color" format="color"/>
<attr name="wheel_selected_item_text_color" format="color"/>
<attr name="wheel_same_width" format="boolean"/>
<attr name="wheel_maximum_width_text" format="string"/>
<attr name="wheel_maximum_width_text_position" format="integer"/>
<attr name="wheel_visible_item_count" format="integer"/>
<attr name="wheel_item_space" format="dimension"/>
<attr name="wheel_cyclic" format="boolean"/>
<attr name="wheel_indicator" format="boolean"/>
<attr name="wheel_indicator_color" format="color"/>
<attr name="wheel_indicator_size" format="dimension"/>
<attr name="wheel_curtain" format="boolean"/>
<attr name="wheel_curtain_color" format="color"/>
<attr name="wheel_atmospheric" format="boolean"/>
<attr name="wheel_curved" format="boolean"/>
<attr name="wheel_item_align" format="enum">
<enum name="center" value="0"/>
<enum name="left" value="1"/>
<enum name="right" value="2"/>
</attr>
</declare-styleable>
<declare-styleable name="SingleDateAndTimePicker">
<attr name="picker_todayText" format="string"/>
<attr name="picker_textColor" format="color"/>
<attr name="picker_selectedTextColor" format="color"/>
<attr name="picker_textSize" format="dimension"/>
<attr name="picker_curved" format="boolean"/>
<attr name="picker_cyclic" format="boolean"/>
<attr name="picker_mustBeOnFuture" format="boolean"/>
<attr name="picker_visibleItemCount" format="integer"/>
<attr name="picker_selectorColor" format="integer"/>
<attr name="picker_selectorHeight" format="dimension"/>
<attr name="picker_displayMonth" format="boolean"/>
<attr name="picker_displayYears" format="boolean"/>
<attr name="picker_displayDays" format="boolean"/>
<attr name="picker_displayMinutes" format="boolean"/>
<attr name="picker_displayHours" format="boolean"/>
</declare-styleable>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="picker_background">#3F51B5</color>
<color name="picker_button_background_selected">#3F51B5</color>
<color name="picker_button_background">@android:color/white</color>
<color name="picker_button_background_innactive">#BDBDBD</color>
<color name="picker_default_text_color">#999</color>
<color name="picker_default_selected_text_color">@android:color/black</color>
<color name="picker_default_selector_color">#ffffff</color>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="WheelItemTextSize">24sp</dimen>
<dimen name="WheelItemSpace">12dp</dimen>
<dimen name="WheelIndicatorSize">2dp</dimen>
<dimen name="WheelMargins">8dp</dimen>
<dimen name="wheel_spacing">30dp</dimen>
<dimen name="wheelSelectorHeight">40dp</dimen>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="picker_today">Today</string>
<string name="picker_am">AM</string>
<string name="picker_pm">PM</string>
</resources>
package com.github.florent37.singledateandtimepicker;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
......@@ -26,6 +26,6 @@ dependencies {
implementation project(':module_main')
implementation project(':module_find')
implementation project(':module_me')
implementation project(':module_trip')
implementation project(':module_news')
}
}
......@@ -170,8 +170,8 @@
<orderEntry type="library" name="Gradle: com.android.support:support-compat-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-28.0.0" level="project" />
<orderEntry type="module" module-name="module_news" />
<orderEntry type="module" module-name="module_main" />
<orderEntry type="module" module-name="module_trip" />
<orderEntry type="module" module-name="module_me" />
<orderEntry type="module" module-name="module_find" />
<orderEntry type="module" module-name="lib_refresh_layout" />
......
......@@ -50,7 +50,7 @@ dependencies {
if (!isModule.toBoolean()) {
implementation project(':module_find')
implementation project(':module_me')
implementation project(':module_trip')
implementation project(':module_news')
}
}
\ No newline at end of file
......@@ -166,7 +166,7 @@
<orderEntry type="library" name="Gradle: com.android.support:support-compat-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-28.0.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-28.0.0" level="project" />
<orderEntry type="module" module-name="module_trip" />
<orderEntry type="module" module-name="module_news" />
<orderEntry type="module" module-name="module_me" />
<orderEntry type="module" module-name="module_find" />
<orderEntry type="module" module-name="lib_refresh_layout" />
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册