일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Android Interceptor
- Android Jetpack
- 카카오 알고리즘
- 프로그래머스 알고리즘
- Android 12
- Android WebView
- scope function
- Android
- Android ProgressBar
- 습관만들기
- Android Navigation
- MVP Architecture
- 영어독립365
- DataBinding
- Java
- 영어공부
- 안드로이드 fcm
- Kotlin FCM
- 안드로이드 갤러리 접근
- 안드로이드 카카오 로그인
- android recyclerview
- 안드로이드
- Android DataBinding
- WebView
- OkHttp Interceptor
- 알고리즘 자바
- Android ViewPager2
- Kotlin
- Android 12 대응
- 66챌린지
Archives
- Today
- Total
Developer Geek
[Android] 달력 예제 in Kotlin 본문
반응형
개요
달력 예제 구현에서 캘린더 뷰는 material-calendarview를 사용한다.
구현 내용
- 캘린더 상단에 보여지는
월.년
디폴트값을년.월
로 커스터마이징한다. - 캘린더 요일을 한국어로 커스터마이징한다.
- 달력의 날짜 텍스트를 커스터마이징한다.
- 휴무일 개념으로 특정 날짜의 상태를
disable
처리한다. - 현재 일을 기준으로 과거의 날짜의 상태를
disable
처리한다.
실행 화면
예제 구현
Gradle Scripts\settings.gradle: Jitpack Repository
추가
dependencyResolutionManagement {
...
repositories {
...
maven { url 'https://jitpack.io' }
}
}
build.gradle(Module): 의존성 추가
dependencies {
...
// Calendar
implementation 'com.github.prolificinteractive:material-calendarview:2.0.1'
}
build.gradle(Module): ViewBinding 추가
android {
...
buildFeatures{
viewBinding true
}
}
themes.xml: 달력 텍스트 스타일 수정하기 위한 소스 추가
themes.xml
파일에 달력 텍스트 스타일을 수정하기 위해 사용할 <style name="TextStyleSemiBold15"/>
를 추가한다
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.SampleCalenderView" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
...
<!-- Customize your theme here. -->
</style>
<style name="TextStyleSemiBold15">
...
</style>
</resources>
activity_main.xml: CalendarView 추가
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.prolificinteractive.materialcalendarview.MaterialCalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:mcv_selectionColor="#00F"
app:mcv_weekDayTextAppearance="@style/TextStyleSemiBold15"
app:mcv_showOtherDates="all" />
</androidx.constraintlayout.widget.ConstraintLayout>
app:mcv_selectionColor="#00F"
: 캘린더에서 날짜를 선택 했을 때, 선택된 날짜에 처리되는 색이다.app:mcv_weekDayTextAppearance="@style/TextStyleSemiBold15"
: 캘린더의 날짜 텍스트 스타일을 설정한다.app:mcv_showOtherDates="all"
: 달력 뷰에 보여지는 날짜의 스타일을 지정한다.all
을 선택하면 해당 달의이전
,이후
의 날짜도 보여준다.
MainActivity.kt
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val today = CalendarDay.today()
val disabledDates = hashSetOf<CalendarDay>()
disabledDates.add(CalendarDay.from(2022, 7, 12))
binding.calendarView.apply {
// 휴무일 지정을 위한 Decorator 설정
addDecorator(DayDisableDecorator(disabledDates, today))
// 요일을 지정하귀 위해 {"월", "화", ..., "일"} 배열을 추가한다.
setWeekDayLabels(arrayOf("월", "화", "수", "목", "금", "토", "일"))
// 달력 상단에 `월 년` 포맷을 수정하기 위해 TitleFormatter 설정
setTitleFormatter(MyTitleFormatter())
}
DateFormatTitleFormatter()
}
inner class MyTitleFormatter : TitleFormatter {
override fun format(day: CalendarDay?): CharSequence {
val simpleDateFormat =
SimpleDateFormat("yyyy.MM", Locale.US) //"February 2016" format
return simpleDateFormat.format(Calendar.getInstance().getTime())
}
}
inner class DayDisableDecorator : DayViewDecorator {
private var dates = HashSet<CalendarDay>()
private var today: CalendarDay
constructor(dates: HashSet<CalendarDay>, today: CalendarDay) {
this.dates = dates
this.today = today
}
override fun shouldDecorate(day: CalendarDay): Boolean {
// 휴무일 || 이전 날짜
return dates.contains(day) || day.isBefore(today)
}
override fun decorate(view: DayViewFacade?) {
view?.let { it.setDaysDisabled(true) }
}
}
}
휴무일 지정(Disable 처리) - CalendarView에 Decorator 설정을 위한 DayViewDecorator 인터페이스 구현
inner class DayDisableDecorator : DayViewDecorator {
private var dates = HashSet<CalendarDay>()
private var today: CalendarDay
constructor(dates: HashSet<CalendarDay>, today: CalendarDay) {
this.dates = dates
this.today = today
}
override fun shouldDecorate(day: CalendarDay): Boolean {
// 휴무일 || 이전 날짜
return dates.contains(day) || day.isBefore(today)
}
override fun decorate(view: DayViewFacade?) {
view?.let { it.setDaysDisabled(true) }
}
}
dates
: 휴무일을 저장하는 Settoday
: 현재 날짜를 저장하는 변수shouldDecorate(day)
: 해당 날짜가dates
Set에 포함되어있거나today
보다 과거이면 Decorate가 되기위해true
값을 반환한다.decorate(view)
:shouldDecorate
함수를 통해서true
값을 갖는 날짜 view에disable
처리를 한다.
질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
zero5.two4@gmail.com
반응형
'안드로이드 > View' 카테고리의 다른 글
[Android] ViewPager Basic Sample in Kotlin (0) | 2022.08.08 |
---|---|
[Android] ViewPager2 and TabLayout Sample in Kotlin (0) | 2022.07.28 |
[Android] WebView란 (0) | 2022.06.27 |
안드로이드 막대 프로그레스바 구현 예제 in Kotlin (0) | 2022.06.25 |
안드로이드 원형 프로그레스바 in Kotlin (0) | 2022.06.20 |
Comments