Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

CalendarView

Компонент CalendarView находится в разделе Widgets и выводит на экран календарь.

Описание всех атрибутов можно взять из документации.


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <CalendarView
        android:id="@+id/calendarView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="onClick"
        android:selectedWeekBackgroundColor="#ff0000"
        android:weekNumberColor="#0000ff"
        android:weekSeparatorLineColor="#00ff00" />

</LinearLayout>

В данном случае я выбрал цвет для выбранной недели (красный), цвет для номера недели (синий) и цвет для разделителей (зелёный). Спустя несколько лет обнаружил, что данные атрибуты теперь считаются устаревшими и игнорируются.

Выбранную дату можно отслеживать через метод setOnDateChangeListener():


// Kotlin
package ru.alexanderklimov.calendar

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        calendarView.setOnDateChangeListener { view, year, month, dayOfMonth ->
            textView.text = "$dayOfMonth.${month + 1}.$year"
        }
    }
}

// Java @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CalendarView calendarView = findViewById(R.id.calendarView); calendarView.setOnDateChangeListener(new OnDateChangeListener() { @Override public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) { int mYear = year; int mMonth = month; int mDay = dayOfMonth; String selectedDate = new StringBuilder().append(mMonth + 1) .append("-").append(mDay).append("-").append(mYear) .append(" ").toString(); Toast.makeText(getApplicationContext(), selectedDate, Toast.LENGTH_LONG).show(); } }); }

CalendarView

Получить выбранную дату

В предыдущем примере мы получали выбранную дату через слушатель. Получить выбранную дату по щелчку кнопки по идее можно через метод getDate(). По крайней мере в документации говорится, что возвращается выбранная дата, но в реальности возвращается сегодняшняя дата. Оставил пример для демонстрации взаимодействия между CalendarView и объектом Calendar.

Добавим на экран активности кнопки и напишем код для её щелчка.


button.setOnClickListener {
    val selectedDate = calendarView.date
    val calendar = Calendar.getInstance()
    calendar.timeInMillis = selectedDate
    val dateFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM)
    textView.text = "Selected date: ${dateFormatter.format(calendar.time)}"
}

Программно установить дату в CalendarView

Сделаем обратную задачу - мы получили дату в виде объекта Calendar и хотим установить её в CalendarView. Не забывайте, что отсчёт месяцев идёт с 0.


button.setOnClickListener {
    val calendar = Calendar.getInstance()
    calendar.set(
        2020,
        6,
        27
    )
    calendarView.date = calendar.timeInMillis
}

Вместо вызова свойства calendarView.date можно вызвать метод setDate(), который имеет перегруженную версию с тремя параметрами.


//calendarView.date = calendar.timeInMillis
calendarView.setDate(calendar.timeInMillis, true, true)

Установить минимальную и максимальную даты

Компонент позволяет установить минимальную и максимальную даты через атрибуты minDate и maxDate, все остальные даты вне заданного промежутка будут недоступны.


<CalendarView
    ...
    android:maxDate="6/28/2020"
    android:minDate="6/10/2020"
    ... />

Также можно установить эти даты программно через calendarView.minDate и calendarView.maxDate.

Дополнительное чтение

psinetron/slycalendarview

GitHub - savvisingh/DateRangePicker: Date Range Picker is a Calendar Picker View to show a Customized Date Range Picker with improved UI and functionality to add subtitles to the dates

GitHub - SimpleMobileTools/Simple-Calendar: A simple calendar with events, customizable widgets and no ads.

GitHub - kizitonwose/CalendarView: A highly customizable calendar library for Android, powered by RecyclerView.

CleverPumpkin/CrunchyCalendar: A beautiful material calendar with endless scroll, range selection and a lot more!

prolificinteractive/material-calendarview - по уверению автора, лучший вариант календаря, чем системный.

dpreussler/clean-simple-calendar - ещё один календарь с настройками.

roomorama/Caldroid: A better calendar for Android - очень навороченный известный календарь.

mahendramahi/CalendarView - может этот понравится.

vikramkakkar/SublimePicker позволяет выбрать дату, время и повторяющие интервалы.

Applandeo/Material-Calendar-View: Material Calendar View for Android

Реклама