diff --git a/README.md b/README.md index 5da00a4415babf47f3c3fc94543c3038ce1be690..23701cf2d3d4338defca6378ab5d11a6499370a0 100644 --- a/README.md +++ b/README.md @@ -37,11 +37,64 @@ allprojects { 并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 #### 使用说明 +1、初始化SwitchDateTimeDialogFragment ```java -dateTimeFragment.set24HoursMode(false); -dateTimeFragment.setHighlightAMPMSelection(false); -dateTimeFragment.setMinimumDateTime(new GregorianCalendar(2015, Calendar.JANUARY, 1).getTime()); -dateTimeFragment.setMaximumDateTime(new GregorianCalendar(2025, Calendar.DECEMBER, 31).getTime()); +SwitchDateTimeDialogFragment dateTimeFragment = SwitchDateTimeDialogFragment.newInstance( + getAbility(), + getString(ResourceTable.String_label_datetime_dialog), + "OK", + "Cancel", + getString(ResourceTable.String_clean) // Optional + ); +``` +2、设置日期 +```java + // Optionally define a timezone + dateTimeFragment.setTimeZone(TimeZone.getDefault()); + + // Init format + final SimpleDateFormat myDateFormat = new SimpleDateFormat("d MMM yyyy HH:mm", java.util.Locale.getDefault()); + // Assign unmodifiable values + dateTimeFragment.set24HoursMode(false); + dateTimeFragment.setHighlightAMPMSelection(false); + dateTimeFragment.setMinimumDateTime(new GregorianCalendar(2015, Calendar.JANUARY, 1).getTime()); + dateTimeFragment.setMaximumDateTime(new GregorianCalendar(2025, Calendar.DECEMBER, 31).getTime()); + + // Define new day and month format + try { + dateTimeFragment.setSimpleDateMonthAndDayFormat(new SimpleDateFormat("MMMM dd", Locale.getDefault())); + } catch (SwitchDateTimeDialogFragment.SimpleDateMonthAndDayFormatException e) { + + e.fillInStackTrace(); + } +``` +3、设置回调监听 +```java + // Set listener for date + dateTimeFragment.setOnButtonClickListener(new SwitchDateTimeDialogFragment.OnButtonWithNeutralClickListener() { + @Override + public void onPositiveButtonClick(Date date) { + textView.setText(myDateFormat.format(date)); + } + + @Override + public void onNegativeButtonClick(Date date) { + // Do nothing + } + + @Override + public void onNeutralButtonClick(Date date) { + // Optional if neutral button does'nt exists + textView.setText(""); + } + }); +``` +4、显示日历组件 +```java + dateTimeFragment.startAtCalendarView(); + dateTimeFragment.setDefaultDateTime(new GregorianCalendar(2017, + Calendar.MARCH, 4, 15, 20).getTime()); + dateTimeFragment.show(); ``` #### 测试信息 diff --git a/entry/src/main/config.json b/entry/src/main/config.json index 1d555f0867c3dc9bc6e9bc323eff773772004676..7f7434e5980726d6bb7417acc4e5eb93c697a891 100644 --- a/entry/src/main/config.json +++ b/entry/src/main/config.json @@ -33,6 +33,9 @@ ] } ], + "configChanges": [ + "orientation" + ], "orientation": "unspecified", "name": "com.kunzisoft.switchdatetimesample.MainAbility", "icon": "$media:icon", diff --git a/entry/src/main/java/com/kunzisoft/switchdatetimesample/slice/MainAbilitySlice.java b/entry/src/main/java/com/kunzisoft/switchdatetimesample/slice/MainAbilitySlice.java index 0d651ef0ed3f49aa7f024b28e4c2e4d0ffbe841e..60a1ad9b3b6d65c833905310c9096634b25b47e2 100644 --- a/entry/src/main/java/com/kunzisoft/switchdatetimesample/slice/MainAbilitySlice.java +++ b/entry/src/main/java/com/kunzisoft/switchdatetimesample/slice/MainAbilitySlice.java @@ -2,14 +2,18 @@ package com.kunzisoft.switchdatetimesample.slice; import com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment; import com.kunzisoft.switchdatetimesample.ResourceTable; - import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; import ohos.agp.components.Button; import ohos.agp.components.Component; import ohos.agp.components.Text; import ohos.agp.utils.Color; +import ohos.agp.window.service.Display; +import ohos.agp.window.service.DisplayManager; import ohos.agp.window.service.WindowManager; +import ohos.bundle.AbilityInfo; +import ohos.data.DatabaseHelper; +import ohos.data.preferences.Preferences; import java.text.SimpleDateFormat; import java.util.*; @@ -23,12 +27,29 @@ public class MainAbilitySlice extends AbilitySlice { private Text textView; private SwitchDateTimeDialogFragment dateTimeFragment; + private Preferences mOrientation; + private Preferences mTimeDataSave; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); + // 创建轻量级数据存储 + DatabaseHelper databaseHelper = new DatabaseHelper(this); + mOrientation = databaseHelper.getPreferences("ori_pref"); + mTimeDataSave = databaseHelper.getPreferences("time_pref"); + + // 通过获取屏幕宽高来间接判断当前横竖屏情况,getDisplayOrientation()无法获取到横竖屏 + Display display = DisplayManager.getInstance().getDefaultDisplay(this).get(); + if (display.getAttributes().width > display.getAttributes().height) { + // 判断为横屏,保存 + mOrientation.putBoolean("orientation", false); + } else { + // 判断为竖屏,保存 + mOrientation.putBoolean("orientation", true); + } + WindowManager.getInstance().getTopWindow().get().setStatusBarColor(Color.getIntColor("#b71c1c")); textView = (Text) findComponentById(ResourceTable.Id_textView); // Construct SwitchDateTimePicker @@ -63,7 +84,7 @@ public class MainAbilitySlice extends AbilitySlice { dateTimeFragment.setOnButtonClickListener(new SwitchDateTimeDialogFragment.OnButtonWithNeutralClickListener() { @Override public void onPositiveButtonClick(Date date) { - textView.setText(myDateFormat.format(date)); + textView.setText(myDateFormat.format(date)); } @Override @@ -99,4 +120,37 @@ public class MainAbilitySlice extends AbilitySlice { public void onForeground(Intent intent) { super.onForeground(intent); } + + @Override + protected void onOrientationChanged(AbilityInfo.DisplayOrientation displayOrientation) { + super.onOrientationChanged(displayOrientation); + System.out.println("-->>onOrientationChanged = " + displayOrientation); + + if (AbilityInfo.DisplayOrientation.LANDSCAPE == displayOrientation) { + mOrientation.putBoolean("orientation", false); + } else if (AbilityInfo.DisplayOrientation.PORTRAIT == displayOrientation) { + mOrientation.putBoolean("orientation", true); + } + + boolean s = false; + if (dateTimeFragment.isShowing()) { + dateTimeFragment.destroy(); + s = true; + } + + // 刷新ability + onStart(null); + + if (s) { + // 重新show dialog + System.out.println("-->>onOrientationChanged = " + mTimeDataSave.getInt("month", 2)); + dateTimeFragment.setDefaultDateTime(new GregorianCalendar( + mTimeDataSave.getInt("year", 2017), + mTimeDataSave.getInt("month", 2), + mTimeDataSave.getInt("day", 4), + mTimeDataSave.getInt("hour", 15), + mTimeDataSave.getInt("minute", 20)).getTime()); + dateTimeFragment.show(); + } + } } diff --git a/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/MyApplication.java b/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/MyApplication.java index 391462286257fec5403945c61dcd8d00549b0df1..2ae846f5fd4d23edad4211b1df26db25816583e2 100644 --- a/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/MyApplication.java +++ b/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/MyApplication.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.kunzisoft.switchdatetime; import ohos.aafwk.ability.AbilityPackage; diff --git a/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/SwitchDateTimeDialogFragment.java b/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/SwitchDateTimeDialogFragment.java index ebba0f749977d08e441116d4cf4381809ae9faa9..6f409c5ac5a9a049f17b2c79d2650c608b99ab4d 100644 --- a/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/SwitchDateTimeDialogFragment.java +++ b/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/SwitchDateTimeDialogFragment.java @@ -6,7 +6,6 @@ import com.kunzisoft.switchdatetime.event.MessageEvent; import com.kunzisoft.switchdatetime.provider.PageProvider; import com.kunzisoft.switchdatetime.time.RadialPickerLayout; import com.kunzisoft.switchdatetime.time.SwitchTimePicker; - import ohos.aafwk.ability.Ability; import ohos.agp.animation.Animator; import ohos.agp.animation.AnimatorProperty; @@ -14,9 +13,13 @@ import ohos.agp.colors.RgbColor; import ohos.agp.components.*; import ohos.agp.components.element.ShapeElement; import ohos.agp.utils.Color; +import ohos.agp.utils.LayoutAlignment; import ohos.agp.window.dialog.CommonDialog; +import ohos.agp.window.service.Display; +import ohos.agp.window.service.DisplayManager; import ohos.app.Context; - +import ohos.data.DatabaseHelper; +import ohos.data.preferences.Preferences; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -34,6 +37,8 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { private static final String STATE_CURRENT_POSITION = "STATE_CURRENT_POSITION"; private static final int UNDEFINED_POSITION = -1; + private static boolean isOrientation; + private final Preferences mTimeDataSave; private Calendar dateTimeCalendar = Calendar.getInstance(); private Calendar minimumDateTime = new GregorianCalendar(1970, 1, 1); private Calendar maximumDateTime = new GregorianCalendar(2200, 1, 1); @@ -85,6 +90,15 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { private SwitchDateTimeDialogFragment(Context context) { super(context); + + // 获取保存的手机横竖屏情况(true - 竖屏;false - 横屏) + DatabaseHelper databaseHelper = new DatabaseHelper(mContext); + Preferences orientation = databaseHelper.getPreferences("ori_pref"); + mTimeDataSave = databaseHelper.getPreferences("time_pref"); + isOrientation = orientation.getBoolean("orientation", true); + + startAtPosition = mTimeDataSave.getInt("positionView", UNDEFINED_POSITION); + System.out.println("-->>SwitchDateTimeDialogFragment = "+startAtPosition); } /** @@ -132,6 +146,9 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { EventBus.getDefault().register(this); dateTimeCalendar.setTimeZone(timeZone); + Display display = DisplayManager.getInstance().getDefaultDisplay(mContext).get(); + System.out.println("-->>onCreate.width:" + display.getAttributes().width + "--height:" + display.getAttributes().height); + // Throw exception if default select date isn't between minimumDateTime and maximumDateTime if (dateTimeCalendar.before(minimumDateTime) || dateTimeCalendar.after(maximumDateTime)) throw new RuntimeException("Default date " + dateTimeCalendar.getTime() + " must be between " @@ -139,7 +156,14 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { LayoutScatter inflater = LayoutScatter.getInstance(mContext); - dateTimeLayout = inflater.parse(ResourceTable.Layout_dialog_switch_datetime_picker, + // 获取当前布局 + int xmlId; + if (isOrientation) { + xmlId = ResourceTable.Layout_dialog_switch_datetime_picker; + } else { + xmlId = ResourceTable.Layout_dialog_switch_datetime_picker_land; + } + dateTimeLayout = inflater.parse(xmlId, (ComponentContainer) ((Ability) mContext).findComponentById(ResourceTable.Id_datetime_picker), true); @@ -308,7 +332,8 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { public void onYearSelected(Component view, int yearPicker) { dateTimeCalendar.set(Calendar.YEAR, yearPicker); yearHeaderValues.setText(yearSimpleDate.format(dateTimeCalendar.getTime())); - + original_year = yearPicker - 1; + setMonth(); } }); //BuildDatePicker @@ -319,7 +344,13 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { Button btNegative = (Button) dateTimeLayout.findComponentById(ResourceTable.Id_btNegative); Button btNeutral = (Button) dateTimeLayout.findComponentById(ResourceTable.Id_btNeutral); setContentCustomComponent(dateTimeLayout); - setSize(1020, 2280); + if (isOrientation) { + setSize(1020, 2280); + } else { + setSize(1680, 1020); + setAlignment(LayoutAlignment.CENTER); + } + btPositive.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { @@ -350,6 +381,13 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { } }); + + System.out.println("-->>startAtPosition = "+startAtPosition); + viewSwitcher.setCurrentIndex(startAtPosition); + if (viewSwitcher.getCurrentIndex() == 0) { + ((RadialPickerLayout) ((DirectionalLayout) viewSwitcher.getCurrentComponent()).getComponentAt(0)).refresh(); + } + } private void CalendarPicker() { @@ -405,6 +443,7 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { String mon = ""; int year = original_year; int month = original_month + pageSlider.getCurrentPage(); + System.out.println("-->>setMonth = " + original_month + "--" + pageSlider.getCurrentPage()); if (month > 11) { int times = month / 12; year = year + times; @@ -532,6 +571,15 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { super.onDestroy(); EventBus.getDefault().unregister(this); startAtPosition = UNDEFINED_POSITION; + + if (mTimeDataSave != null) { + System.out.println("-->>onDestroy = " + dateTimeCalendar.get(Calendar.MONTH)); + mTimeDataSave.putInt("year", dateTimeCalendar.get(Calendar.YEAR)); + mTimeDataSave.putInt("month", dateTimeCalendar.get(Calendar.MONTH)); + mTimeDataSave.putInt("day", dateTimeCalendar.get(Calendar.DAY_OF_MONTH)); + mTimeDataSave.putInt("hour", dateTimeCalendar.get(Calendar.HOUR_OF_DAY)); + mTimeDataSave.putInt("minute", dateTimeCalendar.get(Calendar.MINUTE)); + } } /** @@ -713,6 +761,15 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { */ public void setDefaultDateTime(Date date) { this.dateTimeCalendar.setTime(date); + if (mTimeDataSave != null) { + mTimeDataSave.putInt("year", dateTimeCalendar.get(Calendar.YEAR)); + mTimeDataSave.putInt("month", dateTimeCalendar.get(Calendar.MONTH)); + mTimeDataSave.putInt("day", dateTimeCalendar.get(Calendar.DAY_OF_MONTH)); + mTimeDataSave.putInt("hour", dateTimeCalendar.get(Calendar.HOUR_OF_DAY)); + mTimeDataSave.putInt("minute", dateTimeCalendar.get(Calendar.MINUTE)); + } + original_month = dateTimeCalendar.get(Calendar.MONTH); + original_year = dateTimeCalendar.get(Calendar.YEAR) - 1; } /** @@ -897,6 +954,9 @@ public class SwitchDateTimeDialogFragment extends CommonDialog { } startAtPosition = positionView; + if (mTimeDataSave != null) { + mTimeDataSave.putInt("positionView", startAtPosition); + } } } } diff --git a/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/provider/CalendarProvider.java b/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/provider/CalendarProvider.java index c7f23dd90220b108eeec2b85f7dd2dbcc7da8285..00282ee3cf92df7e1d04b4c7f408604d015ffaa6 100644 --- a/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/provider/CalendarProvider.java +++ b/switchdatetime/src/main/java/com/kunzisoft/switchdatetime/provider/CalendarProvider.java @@ -24,6 +24,8 @@ import ohos.agp.components.*; import ohos.agp.utils.Color; import ohos.app.Context; +import ohos.data.DatabaseHelper; +import ohos.data.preferences.Preferences; import org.greenrobot.eventbus.EventBus; @@ -47,6 +49,7 @@ public class CalendarProvider extends BaseItemProvider { private DependentLayout lastview = null; private boolean isCk = true; private boolean isCurrentMonth; + private boolean isOrientation; /** * 构造方法 @@ -64,6 +67,13 @@ public class CalendarProvider extends BaseItemProvider { int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); firstWeekOffset = Calendar.SATURDAY - dayOfWeek + 1; offset = firstWeekOffset - 7; + +// System.out.println("-->>CalendarProvider."+original_year+"--"+original_month+"--"+original_day); + + // 获取保存的手机横竖屏情况(true - 竖屏;false - 横屏) + DatabaseHelper databaseHelper = new DatabaseHelper(context); + Preferences orientation = databaseHelper.getPreferences("ori_pref"); + isOrientation = orientation.getBoolean("orientation", true); } @Override @@ -85,8 +95,15 @@ public class CalendarProvider extends BaseItemProvider { public Component getComponent(int position, Component componentP, ComponentContainer componentContainer) { Component component = componentP; if (component == null) { + // 获取当前布局 + int xmlId; + if (isOrientation) { + xmlId = ResourceTable.Layout_calendar_item_layout; + } else { + xmlId = ResourceTable.Layout_calendar_item_layout_land; + } component = LayoutScatter.getInstance(context) - .parse(ResourceTable.Layout_calendar_item_layout, null, false); + .parse(xmlId, null, false); viewHolder = new ViewHolder(); component.setTag(viewHolder); } else { diff --git a/switchdatetime/src/main/resources/base/layout/calendar_item_layout_land.xml b/switchdatetime/src/main/resources/base/layout/calendar_item_layout_land.xml new file mode 100644 index 0000000000000000000000000000000000000000..1621666731925f6aae38721a2d073e7719772487 --- /dev/null +++ b/switchdatetime/src/main/resources/base/layout/calendar_item_layout_land.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/switchdatetime/src/main/resources/base/layout/dialog_switch_datetime_picker_land.xml b/switchdatetime/src/main/resources/base/layout/dialog_switch_datetime_picker_land.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c7b69be978acae5cee64f2675060913513e65db --- /dev/null +++ b/switchdatetime/src/main/resources/base/layout/dialog_switch_datetime_picker_land.xml @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +