Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Компонент 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();
}
});
}
В предыдущем примере мы получали выбранную дату через слушатель. Получить выбранную дату по щелчку кнопки по идее можно через метод 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)}"
}
Сделаем обратную задачу - мы получили дату в виде объекта 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.
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