MainActivity.kt
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
DefaultTheme {
CalendarApp()
}
}
}
}
@Composable
fun CalendarApp(){
// 시간에 대한 정보
val calendarInstance = Calendar.getInstance()
val time = remember {
mutableStateOf(calendarInstance)
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
CalendarHeader(time)
CalendarHeaderBtn(time)
CalendarDayName()
CalendarDayList(time)
}
}
@Composable
fun CalendarHeader(date: MutableState<Calendar>) {
// xxxx년 00월
val resultTime = SimpleDateFormat("yyyy년 MM월", Locale.KOREA).format(date.value.time)
Text(
text = resultTime,
fontSize = 30.sp
)
}
@Composable
fun CalendarHeaderBtn(date: MutableState<Calendar>) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(top = 30.dp, bottom = 30.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Button(onClick = {
val newDate = Calendar.getInstance()
newDate.time = date.value.time
newDate.add(Calendar.MONTH, -1)
date.value = newDate
},
colors = ButtonDefaults.buttonColors(
containerColor = Color.Black
)
) {
Text(
text = "<",
color = Color.Green
)
}
Button(onClick = {
val newDate = Calendar.getInstance()
newDate.time = date.value.time
newDate.add(Calendar.MONTH, +1)
date.value = newDate
},
colors = ButtonDefaults.buttonColors(
containerColor = Color.Black
)
) {
Text(
text = ">",
color = Color.Green
)
}
}
}
@Composable
fun CalendarDayName() {
val nameList = listOf("일", "월", "화", "수", "목", "금", "토")
Row() {
nameList.forEach {
Box(
modifier = Modifier.weight(1f),
contentAlignment = Alignment.Center
) {
Text(
text = it,
fontSize = 18.sp,
fontWeight = FontWeight.ExtraBold
)
}
}
}
}
@Composable
fun CalendarDayList(date: MutableState<Calendar>){
// 2023년 7월
// 달력 그리는 공식 -> Jetpack Compose로 달력 모양 그리는지
date.value.set(Calendar.DAY_OF_MONTH, 1)
val monthDayMax = date.value.getActualMaximum(Calendar.DAY_OF_MONTH) // 현재 달의 max
val monthFirstDay = date.value.get(Calendar.DAY_OF_WEEK) - 1 // 1일이 무슨 요일부터인지
val monthWeeksCount = (monthDayMax + monthFirstDay + 6) / 7 // 현재 달의 week 갯수
Log.d("monthDayMax", monthDayMax.toString())
Log.d("monthFirstDay", monthFirstDay.toString())
Log.d("monthWeeksCount", monthWeeksCount.toString())
Column() {
repeat(monthWeeksCount) {week ->
Row() {
repeat(7) { day ->
// 날짜 구하는 공식
val resultDay = week * 7 + day - monthFirstDay + 1
if(resultDay in 1 .. monthDayMax) {
Box(
modifier = Modifier
.weight(1f)
.padding(10.dp)
,
contentAlignment = Alignment.Center
) {
Text(
text = resultDay.toString(),
fontSize = 25.sp
)
}
} else {
Spacer(modifier = Modifier.weight(1f))
}
}
}
}
}
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
DefaultTheme {
CalendarApp()
}
}