mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-26 03:01:51 +08:00
NativeView recycled for android
This commit is contained in:
@ -20,15 +20,14 @@ export function getValidTime(picker: TimePickerDefinition, hour: number, minute:
|
||||
}
|
||||
|
||||
let time = { hour: hour, minute: minute };
|
||||
if (!isLessThanMaxTime(picker, hour, minute)) {
|
||||
time = { hour: picker.maxHour, minute: picker.maxMinute };
|
||||
}
|
||||
|
||||
if (!isGreaterThanMinTime(picker, hour, minute)) {
|
||||
time = { hour: picker.minHour, minute: picker.minMinute };
|
||||
}
|
||||
|
||||
if (!isLessThanMaxTime(picker, hour, minute)) {
|
||||
time = { hour: picker.maxHour, minute: picker.maxMinute };
|
||||
}
|
||||
|
||||
return time;
|
||||
}
|
||||
|
||||
@ -96,101 +95,41 @@ export abstract class TimePickerBase extends View implements TimePickerDefinitio
|
||||
public maxMinute: number;
|
||||
}
|
||||
|
||||
export var hourProperty = new Property<TimePickerBase, number>({
|
||||
name: "hour", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue)) {
|
||||
throw new Error(getErrorMessage(picker, "Hour", newValue));
|
||||
}
|
||||
|
||||
if (isValidTime(picker)) {
|
||||
// picker._setNativeTime();
|
||||
if (picker.time) {
|
||||
picker.time.setHours(picker.hour);
|
||||
} else {
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
}
|
||||
} else {
|
||||
throw new Error(getErrorMessage(picker, "Hour", newValue));
|
||||
}
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
hourProperty.register(TimePickerBase);
|
||||
TimePickerBase.prototype.recycleNativeView = true;
|
||||
|
||||
export var minHourProperty = new Property<TimePickerBase, number>({
|
||||
name: "minHour", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue)) {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "minHour", newValue));
|
||||
}
|
||||
if (isValidTime(picker)) {
|
||||
// picker._setNativeMinTime();
|
||||
} else {
|
||||
throw new Error(getErrorMessage(picker, "Hour", newValue));
|
||||
}
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
minHourProperty.register(TimePickerBase);
|
||||
|
||||
export var maxHourProperty = new Property<TimePickerBase, number>({
|
||||
name: "maxHour", defaultValue: 23, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue)) {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "maxHour", newValue));
|
||||
}
|
||||
|
||||
if (isValidTime(picker)) {
|
||||
// picker._setNativeMaxTime();
|
||||
} else {
|
||||
throw new Error(getErrorMessage(picker, "Hour", newValue));
|
||||
}
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
maxHourProperty.register(TimePickerBase);
|
||||
|
||||
export var minuteProperty = new Property<TimePickerBase, number>({
|
||||
name: "minute", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue)) {
|
||||
throw new Error(getErrorMessage(picker, "minute", newValue));
|
||||
}
|
||||
|
||||
if (isValidTime(picker)) {
|
||||
// picker._setNativeTime();
|
||||
if (picker.time) {
|
||||
picker.time.setMinutes(picker.minute);
|
||||
} else {
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
}
|
||||
} else {
|
||||
throw new Error(getErrorMessage(picker, "Minute", newValue));
|
||||
}
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
minuteProperty.register(TimePickerBase);
|
||||
|
||||
export var minMinuteProperty = new Property<TimePickerBase, number>({
|
||||
name: "minMinute", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue)) {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "minMinute", newValue));
|
||||
}
|
||||
|
||||
if (isValidTime(picker)) {
|
||||
// picker._setNativeMinTime();
|
||||
} else {
|
||||
throw new Error(getErrorMessage(picker, "Minute", newValue));
|
||||
}
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
minMinuteProperty.register(TimePickerBase);
|
||||
|
||||
export var maxMinuteProperty = new Property<TimePickerBase, number>({
|
||||
name: "maxMinute", defaultValue: 59, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue)) {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "maxMinute", newValue));
|
||||
}
|
||||
|
||||
if (isValidTime(picker)) {
|
||||
// picker._setNativeMaxTime();
|
||||
} else {
|
||||
throw new Error(getErrorMessage(picker, "Minute", newValue));
|
||||
}
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
maxMinuteProperty.register(TimePickerBase);
|
||||
@ -208,6 +147,29 @@ function dateComparer(x: Date, y: Date): boolean {
|
||||
return (x <= y && x >= y) ? true : false;
|
||||
}
|
||||
|
||||
export var minuteProperty = new Property<TimePickerBase, number>({
|
||||
name: "minute", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "minute", newValue));
|
||||
}
|
||||
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
minuteProperty.register(TimePickerBase);
|
||||
|
||||
export var hourProperty = new Property<TimePickerBase, number>({
|
||||
name: "hour", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "Hour", newValue));
|
||||
}
|
||||
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
|
||||
}, valueConverter: (v) => parseInt(v)
|
||||
});
|
||||
hourProperty.register(TimePickerBase);
|
||||
|
||||
export var timeProperty = new Property<TimePickerBase, Date>({
|
||||
name: "time", equalityComparer: dateComparer, valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isValidTime(picker)) {
|
||||
@ -216,7 +178,6 @@ export var timeProperty = new Property<TimePickerBase, Date>({
|
||||
|
||||
picker.hour = newValue.getHours();
|
||||
picker.minute = newValue.getMinutes();
|
||||
// picker._set
|
||||
}
|
||||
});
|
||||
timeProperty.register(TimePickerBase);
|
||||
timeProperty.register(TimePickerBase);
|
@ -13,6 +13,8 @@ function initializeTimeChangedListener(): void {
|
||||
return;
|
||||
}
|
||||
|
||||
apiLevel = android.os.Build.VERSION.SDK_INT;
|
||||
|
||||
@Interfaces([android.widget.TimePicker.OnTimeChangedListener])
|
||||
class TimeChangedListenerImpl extends java.lang.Object implements android.widget.TimePicker.OnTimeChangedListener {
|
||||
constructor(public owner: TimePicker) {
|
||||
@ -22,8 +24,13 @@ function initializeTimeChangedListener(): void {
|
||||
|
||||
onTimeChanged(picker: android.widget.TimePicker, hour: number, minute: number): void {
|
||||
const timePicker = this.owner;
|
||||
let validTime = getValidTime(timePicker, hour, minute);
|
||||
timePicker._setNativeValueSilently(validTime.hour, validTime.minute);
|
||||
if (timePicker.updatingNativeValue) {
|
||||
return;
|
||||
}
|
||||
|
||||
const validTime = getValidTime(timePicker, hour, minute);
|
||||
hourProperty.nativeValueChange(timePicker, validTime.hour);
|
||||
minuteProperty.nativeValueChange(timePicker, validTime.minute);
|
||||
timeProperty.nativeValueChange(timePicker, new Date(0, 0, 0, validTime.hour, validTime.minute));
|
||||
}
|
||||
}
|
||||
@ -31,71 +38,59 @@ function initializeTimeChangedListener(): void {
|
||||
TimeChangedListener = TimeChangedListenerImpl;
|
||||
}
|
||||
|
||||
let apiLevel: number;
|
||||
|
||||
export class TimePicker extends TimePickerBase {
|
||||
private _android: android.widget.TimePicker;
|
||||
private _listener: android.widget.TimePicker.OnTimeChangedListener;
|
||||
nativeView: android.widget.TimePicker;
|
||||
updatingNativeValue: boolean;
|
||||
|
||||
public _createNativeView() {
|
||||
initializeTimeChangedListener();
|
||||
this._android = new android.widget.TimePicker(this._context);
|
||||
this._listener = this._listener || new TimeChangedListener(this);
|
||||
this._android.setOnTimeChangedListener(this._listener);
|
||||
|
||||
let c = java.util.Calendar.getInstance();
|
||||
if (this.hour === 0) {
|
||||
this.hour = c.get(java.util.Calendar.HOUR_OF_DAY);
|
||||
}
|
||||
|
||||
if (this.minute === 0) {
|
||||
this.minute = c.get(java.util.Calendar.MINUTE);
|
||||
}
|
||||
|
||||
let validTime = getValidTime(this, this.hour, this.minute);
|
||||
this._setNativeValueSilently(validTime.hour, validTime.minute);
|
||||
return this._android;
|
||||
const nativeView = new android.widget.TimePicker(this._context);
|
||||
const listener = new TimeChangedListener(this);
|
||||
nativeView.setOnTimeChangedListener(listener);
|
||||
(<any>nativeView).listener = listener;
|
||||
(<any>nativeView).calendar = java.util.Calendar.getInstance();
|
||||
return nativeView;
|
||||
}
|
||||
|
||||
get android(): android.widget.TimePicker {
|
||||
return this._android;
|
||||
}
|
||||
public _initNativeView(): void {
|
||||
const nativeView: any = this.nativeView;
|
||||
nativeView.listener.owner = this;
|
||||
|
||||
public _setNativeValueSilently(hour: number, minute: number) {
|
||||
if (this._android) {
|
||||
this._android.setOnTimeChangedListener(null);
|
||||
const calendar = (<any>nativeView).calendar;
|
||||
const hour = hourProperty.isSet(this) ? this.hour : calendar.get(java.util.Calendar.HOUR_OF_DAY);
|
||||
const minute = minuteProperty.isSet(this) ? this.minute : calendar.get(java.util.Calendar.MINUTE);
|
||||
|
||||
this._android.setCurrentHour(new java.lang.Integer(hour));
|
||||
this._android.setCurrentMinute(new java.lang.Integer(minute));
|
||||
|
||||
this.minute = minute;
|
||||
this.hour = hour;
|
||||
|
||||
this._android.setOnTimeChangedListener(this._listener);
|
||||
const validTime = getValidTime(this, hour, minute);
|
||||
if (!timeProperty.isSet(this)) {
|
||||
this.time = new Date(0, 0, 0, validTime.hour, validTime.minute);
|
||||
}
|
||||
}
|
||||
|
||||
public _setNativeTime() {
|
||||
this._setNativeValueSilently(this.hour, this.minute);
|
||||
}
|
||||
|
||||
[timeProperty.getDefault](): Date {
|
||||
let nativeView = this._android;
|
||||
return new Date(0, 0, 0, nativeView.getCurrentHour().intValue(), nativeView.getCurrentMinute().intValue());
|
||||
}
|
||||
[timeProperty.setNative](value: Date) {
|
||||
this._setNativeValueSilently(this.hour, this.minute);
|
||||
}
|
||||
|
||||
[minuteProperty.getDefault](): number {
|
||||
return this._android.getCurrentMinute().intValue();
|
||||
}
|
||||
[minuteProperty.setNative](value: number) {
|
||||
this._setNativeValueSilently(this.hour, value);
|
||||
this.updatingNativeValue = true;
|
||||
try {
|
||||
if (apiLevel >= 23) {
|
||||
(<any>this.nativeView).setMinute(value);
|
||||
} else {
|
||||
this.nativeView.setCurrentMinute(new java.lang.Integer(value));
|
||||
}
|
||||
} finally {
|
||||
this.updatingNativeValue = false;
|
||||
}
|
||||
}
|
||||
|
||||
[hourProperty.getDefault](): number {
|
||||
return this._android.getCurrentHour().intValue()
|
||||
}
|
||||
[hourProperty.setNative](value: number) {
|
||||
this._setNativeValueSilently(value, this.minute);
|
||||
this.updatingNativeValue = true;
|
||||
try {
|
||||
if (apiLevel >= 23) {
|
||||
(<any>this.nativeView).setHour(value);
|
||||
} else {
|
||||
this.nativeView.setCurrentHour(new java.lang.Integer(value));
|
||||
}
|
||||
} finally {
|
||||
this.updatingNativeValue = false;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user