gzu-liyujiang / AndroidPicker

安卓选择器类库,包括日期及时间选择器(可用于出生日期、营业时间等)、单项选择器(可用于性别、民族、职业、学历、星座等)、二三级联动选择器(可用于车牌号、基金定投日期等)、城市地址选择器(分省级、地市级及区县级)、数字选择器(可用于年龄、身高、体重、温度等)、日历选日期择器(可用于酒店及机票预定日期)、颜色选择器、文件及目录选择器、图片选择器等……WheelPicker/DatePicker/TimePicker/OptionPicker/NumberPicker/LinkagePicker/AddressPicker/CarPlatePicker/CalendarPicker/ColorPicker/FilePicker/ImagePicker etc.
Other
6.47k stars 1.47k forks source link

怎么导入 #282

Open 15239545925 opened 2 years ago

15239545925 commented 2 years ago

我看README里的,我只需要用日历选择器。只在根目录gradle添加了一行代码和app的gradl里面引入了日历选择器的依赖。可是一点效果都没有。请问你们是怎么引入的

liyujiang-gzu commented 2 years ago

@15239545925

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
implementation 'com.github.gzu-liyujiang.AndroidPicker:CalendarPicker:4.1.6'
15239545925 commented 2 years ago

可以了,非常感谢。README上没有明确指明版本号。我加的2.0.0.多谢

15239545925 commented 2 years ago

@liyujiang-gzu 您好。请问日历选择器的大小在哪里设置的

liyujiang-gzu commented 2 years ago

@liyujiang-gzu 您好。请问日历选择器的大小在哪里设置的

指的是高度吗?picker.setHeight(...)

15239545925 commented 2 years ago

好的。多谢。如果说把它当成一个控件放到一个固定的位置上显示出来。不是以弹出框的形式覆盖页面上。这样可以实现吗。因为需求是放在一个固定的位置。想问一下可以不可以

liyujiang-gzu commented 2 years ago

好的。多谢。如果说把它当成一个控件放到一个固定的位置上显示出来。不是以弹出框的形式覆盖页面上。这样可以实现吗。因为需求是放在一个固定的位置。想问一下可以不可以

@15239545925 可以,参见自带的demo:

        <com.github.gzuliyujiang.calendarpicker.core.CalendarView
            android:id="@+id/calendar_picker_body"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="10dp" />
        CalendarView calendarView = findViewById(R.id.calendar_picker_body);
        Date minDate = new Date(System.currentTimeMillis() - 5 * android.text.format.DateUtils.DAY_IN_MILLIS);
        Calendar calendar = DateUtils.calendar(minDate);
        calendar.add(Calendar.MONTH, 3);
        Date maxDate = calendar.getTime();
        calendarView.getAdapter()
                .notify(false)
                .single(false)
                .festivalProvider(new MyFestivalProvider())
                .valid(minDate, maxDate)
                //.intervalNotes("开始", "结束")
                .select(minDate.getTime(), minDate.getTime() + 5 * android.text.format.DateUtils.DAY_IN_MILLIS)
                .range(minDate, maxDate)
                .refresh();
15239545925 commented 2 years ago

您好楼主,感谢您的回答。我现在改为固定位置后:calendar.add(Calendar.MONTH, 12);这一行代码我更换为12显示12个月份,但是是往前显示的,21年12月份-22年1月份-22年2月份以此类推。 可以不可以更改为往后显示的:21年12月份-21年11月份-21年10月份 CalendarView calendarView = findViewById(R.id.calendar_picker_body); Date minDate = new Date(System.currentTimeMillis() - 5 android.text.format.DateUtils.DAY_IN_MILLIS); Calendar calendar = DateUtils.calendar(minDate); calendar.add(Calendar.MONTH, 12); Date maxDate = calendar.getTime(); calendarView.getAdapter() .notify(false) .single(false) .festivalProvider(new MyFestivalProvider()) .valid(minDate, maxDate) //.intervalNotes("开始", "结束") .select(minDate.getTime(), minDate.getTime() + 5 android.text.format.DateUtils.DAY_IN_MILLIS) .range(minDate, maxDate) .refresh();

15239545925 commented 2 years ago

还有一个问题是固定位置选择时间后怎么拿到选择的日期。感谢楼主

15239545925 commented 2 years ago

calendar.add(Calendar.MONTH, 12);这一行代码我更换为-12的话显示的全是灰色的,没办法选中

liyujiang-gzu commented 2 years ago

calendar.add(Calendar.MONTH, 12);这一行代码我更换为-12的话显示的全是灰色的,没办法选中

通过设置监听器setOnCalendarSelectedListener获取选择的日期。

关键是.valid(minDate, maxDate).range(minDate, maxDate).select(startDate, endDate),设置了有效的范围、可选范围及已选择的范围,自己设置minDate,和maxDate,Calendar只是用来辅助计算minDate,和maxDate的。

15239545925 commented 2 years ago

请问这个监听器是怎么设置的,通过哪个对象设置setOnCalendarSelectedListener CalendarView calendarView = findViewById(R.id.calendar_picker_body); Date minDate = new Date(System.currentTimeMillis() - 5 android.text.format.DateUtils.DAY_IN_MILLIS); Calendar calendar = DateUtils.calendar(minDate); calendar.add(Calendar.MONTH, 6); Date maxDate = calendar.getTime(); Log.d("aaa", "minDate: " + minDate); Log.d("aaa", "maxDate: " + maxDate); calendarView.getAdapter() .notify(false) .single(false) .festivalProvider(new MyFestivalProvider()) .valid(minDate, maxDate) .intervalNotes("开始", "结束") .select(minDate.getTime(), minDate.getTime() + 5 android.text.format.DateUtils.DAY_IN_MILLIS) .range(minDate, maxDate) .refresh(); calendarView.setOnCalendarSelectedListener

15239545925 commented 2 years ago

您好楼主,时间我改为和弹窗样式的写法了,这样写可以获取之前的日期。但是默认打开是第一个月的。可以做到默认打开是当前月份嘛 Date currentDate = new Date(System.currentTimeMillis()); Calendar minCalendar = DateUtils.calendar(currentDate); minCalendar.add(Calendar.MONTH, -6); minCalendar.set(Calendar.DAY_OF_MONTH, DateUtils.maxDaysOfMonth(minCalendar.getTime())); Date minDate = minCalendar.getTime(); Calendar maxCalendar = DateUtils.calendar(currentDate); maxCalendar.setTime(currentDate); maxCalendar.add(Calendar.MONTH, 1); maxCalendar.set(Calendar.DAY_OF_MONTH, DateUtils.maxDaysOfMonth(maxCalendar.getTime())); Date maxDate = maxCalendar.getTime();

liyujiang-gzu commented 2 years ago

您好楼主,时间我改为和弹窗样式的写法了,这样写可以获取之前的日期。但是默认打开是第一个月的。可以做到默认打开是当前月份嘛 Date currentDate = new Date(System.currentTimeMillis()); Calendar minCalendar = DateUtils.calendar(currentDate); minCalendar.add(Calendar.MONTH, -6); minCalendar.set(Calendar.DAY_OF_MONTH, DateUtils.maxDaysOfMonth(minCalendar.getTime())); Date minDate = minCalendar.getTime(); Calendar maxCalendar = DateUtils.calendar(currentDate); maxCalendar.setTime(currentDate); maxCalendar.add(Calendar.MONTH, 1); maxCalendar.set(Calendar.DAY_OF_MONTH, DateUtils.maxDaysOfMonth(maxCalendar.getTime())); Date maxDate = maxCalendar.getTime();

可以做到默认打开是当前月份的,参考CalebndarPicker的源码,关键代码:

    private void scrollToSelectedPosition() {
        calendarView.post(new Runnable() {
            @Override
            public void run() {
                int position = calendarAdapter.getDatePosition(startDate);
                position = Math.max(position, 0);
                position = Math.min(position, calendarAdapter.getItemCount() - 1);
                calendarView.getLayoutManager().scrollToPositionWithOffset(position, 0);
            }
        });
    }
liyujiang-gzu commented 2 years ago

请问这个监听器是怎么设置的,通过哪个对象设置setOnCalendarSelectedListener CalendarView calendarView = findViewById(R.id.calendar_picker_body); Date minDate = new Date(System.currentTimeMillis() - 5 android.text.format.DateUtils.DAY_IN_MILLIS); Calendar calendar = DateUtils.calendar(minDate); calendar.add(Calendar.MONTH, 6); Date maxDate = calendar.getTime(); Log.d("aaa", "minDate: " + minDate); Log.d("aaa", "maxDate: " + maxDate); calendarView.getAdapter() .notify(false) .single(false) .festivalProvider(new MyFestivalProvider()) .valid(minDate, maxDate) .intervalNotes("开始", "结束") .select(minDate.getTime(), minDate.getTime() + 5 android.text.format.DateUtils.DAY_IN_MILLIS) .range(minDate, maxDate) .refresh(); calendarView.setOnCalendarSelectedListener

calendarAdapter.setOnCalendarSelectedListener(