【问题标题】:Custom calendar previous and next button issue自定义日历上一个和下一个按钮问题
【发布时间】:2019-09-02 09:29:10
【问题描述】:

我正在编写一个带有自定义日历的应用程序,并且我正在尝试添加上个月和下个月的按钮。问题是,当我使用calendar.add(Calendar.MONTH, 1); 时,它增加了 2 个月而不是 1。当我写 calendar.add(Calendar.MONTH, -1); 时,它甚至更奇怪,因为它增加了 3 天,然后它就完全停止工作了。

我尝试了calendar.set(Calendar.MONTH, month + 1);,它在几个月内都能正常工作,但它混合了几年。例如。当它是 2019 年 12 月时,下个月是 2021 年 1 月。当我减少月份时,情况会更糟,因为当它是 11 月时,它会增加一年。我补充说:

if(calendar.get(Calendar.MONTH) == Calendar.JANUARY){
                    calendar.set(Calendar.YEAR, year + 1);
                }

然后下一个按钮可以正常工作。我也用上一个按钮尝试过:

if(calendar.get(Calendar.MONTH) == Calendar.DECEMBER){
                    calendar.set(Calendar.YEAR, year - 1);
                }

但它仍然在 11 月增加了一年。但是,当我在此代码中将 12 月更改为 11 月时,它会减去一年,例如,当它是 2019 年 12 月时,下个月是 2018 年 11 月,它也是不正确的。有任何想法吗?

private void setPreviousButtonClickEvent() {

        layout.bringToFront();
        previousButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calendar.set(Calendar.DAY_OF_MONTH, day);
                calendar.set(Calendar.MONTH, month - 1);
                if(calendar.get(Calendar.MONTH) == Calendar.DECEMBER){
                    calendar.set(Calendar.YEAR, year - 1);
                }
                fillTheCalendar();
            }
        });
    }

    private void setNextButtonClickEvent() {

        layout.bringToFront();
        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calendar.set(Calendar.DAY_OF_MONTH, day);
                calendar.set(Calendar.MONTH, month + 1);
                if(calendar.get(Calendar.MONTH) == Calendar.JANUARY){
                    calendar.set(Calendar.YEAR, year + 1);
                }
                fillTheCalendar();
            }
        });
    }
 private void fillTheCalendar() {

        views = new ArrayList<CalendarViews>();
        calendar = (Calendar) calendar.clone();
        @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM, yyyy");
        long currentDate = calendar.getTimeInMillis();
        String todaysDate = sdf.format(currentDate);
        date.setText(todaysDate);
        // determine the cell for current month's beginning
        year = calendar.get(Calendar.YEAR);
        day = calendar.get(Calendar.DAY_OF_MONTH);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        month = calendar.get(Calendar.MONTH);

        calendar.set(Calendar.MONTH, month);
        int monthBeginningCell = calendar.get(Calendar.DAY_OF_WEEK) - 2;
        // move calendar backwards to the beginning of the week
        calendar.add(Calendar.DAY_OF_MONTH, -monthBeginningCell);

        while (views.size() < DAYS_COUNT) {

            dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
            views.add(new CalendarViews(calendar.getTime(), dayOfMonth, 0, "event"));

            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        final CalendarAdapter adapter = new CalendarAdapter(getContext(), views);
        gridView.setAdapter(adapter);


    }

【问题讨论】:

  • 我这样修复了上一个按钮: if(calendar.get(Calendar.MONTH) == Calendar.NOVEMBER){ calendar.set(Calendar.YEAR, year);它工作正常,但我不明白为什么会这样。

标签: java android


【解决方案1】:

答案是不应该使用 java.util.Calendar。应该使用 java.time :)

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2016-06-29
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多