이번 시간에는 이번 달(4월) 안에 이전 달(3월)과 다음 달(5월)도 같이 나오게 하는 방법을 알아보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.06.11 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기
- 설명 -
1. private lateinit var calendar: Calendar
캘린더 객체 생성
2. calendar.add(Calendar.MONTH, -1)
현재 달에서 -1 해서 변경(4월 -> 3월)
3. calendar.add(Calendar.MONTH, 1)
현재 달에서 +1 해서 변경(4월 -> 5월)
4. monthCalendar[Calendar.DAY_OF_MONTH] = 1
현재 달 일자를 1일로 변경
5. monthCalendar[Calendar.DAY_OF_WEEK]
현재 달 일자의 요일을 숫자로 가져온다.
일요일: 1 , 월요일: 2 ... 토요일: 7
6. monthCalendar.add(Calendar.DAY_OF_MONTH, -firstDayOfMonth)
해당 일자만큼 뺀 날짜로 변경
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var calendar: Calendar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//binding 초기화
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
//현재 날짜
CalendarUtil.selectedDate = LocalDate.now()
//초기화
calendar = Calendar.getInstance()
//화면 설정
setMonthView()
//이전달 버튼 이벤트
binding.preBtn.setOnClickListener {
//현재 월 -1 변수에 담기
CalendarUtil.selectedDate = CalendarUtil.selectedDate.minusMonths(1)
calendar.add(Calendar.MONTH, -1)// 현재 달 -1
setMonthView()
}
//다음달 버튼 이벤트
binding.nextBtn.setOnClickListener {
CalendarUtil.selectedDate = CalendarUtil.selectedDate.plusMonths(1)
calendar.add(Calendar.MONTH, 1) //현재 달 +1
setMonthView()
}
}
//날짜 화면에 보여주기
private fun setMonthView() {
//년월 텍스트뷰 셋팅
binding.monthYearText.text = monthYearFromDate(CalendarUtil.selectedDate)
//날짜 생성해서 리스트에 담기
val dayList = dayInMonthArray()
//어댑터 초기화
val adapter = CalendarAdapter(dayList)
//레이아웃 설정(열 7개)
var manager: RecyclerView.LayoutManager = GridLayoutManager(applicationContext, 7)
//레이아웃 적용
binding.recyclerView.layoutManager = manager
//어뎁터 적용
binding.recyclerView.adapter = adapter
}
//날짜 타입 설정(월, 년)
private fun monthYearFromDate(date: LocalDate): String{
var formatter = DateTimeFormatter.ofPattern("MM월 yyyy")
// 받아온 날짜를 해당 포맷으로 변경
return date.format(formatter)
}
//날짜 생성
private fun dayInMonthArray(): ArrayList<Date>{
var dayList = ArrayList<Date>()
var monthCalendar = calendar.clone() as Calendar
//1일로 셋팅
monthCalendar[Calendar.DAY_OF_MONTH] = 1
//해당 달의 1일의 요일[1:일요일, 2: 월요일.... 7일: 토요일]
val firstDayOfMonth = monthCalendar[Calendar.DAY_OF_WEEK]-1
//요일 숫자만큼 이전 날짜로 설정
//예: 6월1일이 수요일이면 3만큼 이전날짜 셋팅
monthCalendar.add(Calendar.DAY_OF_MONTH, -firstDayOfMonth)
while(dayList.size < 42){
dayList.add(monthCalendar.time)
//1일씩 늘린다. 1일 -> 2일 -> 3일
monthCalendar.add(Calendar.DAY_OF_MONTH, 1)
}
return dayList
}
}
- 설명 -
1. private val dayList: ArrayList <Date>
LocalDate -> Date로 변경
2. dateCalendar.time = monthDate
날짜를 캘린더에 넣는다.
3.var dayNo =
dateCalendar.get(Calendar.DAY_OF_MONTH)
캘린더에서 날짜를 꺼내 변수에 담는다.
4.if(CalendarUtil.selectedDate.dayOfMonth == dayNo)
오늘 날짜와 넘어온 날짜 비교해서 색상 변경
class CalendarAdapter(private val dayList: ArrayList<Date>) :
RecyclerView.Adapter<CalendarAdapter.ItemViewHolder>() {
class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val dayText: TextView = itemView.findViewById(R.id.dayText)
}
//화면 설정
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.calendar_item, parent, false)
return ItemViewHolder(view)
}
//데이터 설정
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
//날짜 변수에 담기
var monthDate = dayList[holder.adapterPosition]
//초기화
var dateCalendar = Calendar.getInstance()
//날짜 캘린더에 담기
dateCalendar.time = monthDate
//캘린더값 날짜 변수에 담기
var dayNo = dateCalendar.get(Calendar.DAY_OF_MONTH)
holder.dayText.text = dayNo.toString()
//현재 날짜 배경색상 변경
if(CalendarUtil.selectedDate.dayOfMonth == dayNo){
holder.itemView.setBackgroundColor(Color.LTGRAY)
}
//텍스트 색상 지정(토,일)
if ((position + 1) % 7 == 0) { //토요일은 파랑
holder.dayText.setTextColor(Color.BLUE)
} else if (position == 0 || position % 7 == 0) { //일요일은 빨강
holder.dayText.setTextColor(Color.RED)
}
//날짜 클릭 이벤트
holder.itemView.setOnClickListener {
//인터페이스를 통해 날짜를 넘겨준다.
var iYear = dateCalendar.get(Calendar.YEAR)
var iMonth = dateCalendar.get(Calendar.MONTH) + 1
var iDay = dateCalendar.get(Calendar.DAY_OF_MONTH)
var yearMonDay = "$iYear 년 $iMonth 월 $iDay 일"
Toast.makeText(holder.itemView.context, yearMonDay, Toast.LENGTH_SHORT).show()
}
}
override fun getItemCount(): Int {
return dayList.size
}
}
2022.05.20 - [안드로이드] - [안드로이드 코틀린] 배열 쉽게 만드는 방법
2022.05.31 - [안드로이드] - [Kotlin 코틀린] 간단한 RecyclerView 만드는 방법 part1 - 데이터 & 화면
2022.05.22 - [안드로이드] - [안드로이드 코틀린] 반복문 while, do while 만드는 방법
[안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정 (0) | 2022.06.14 |
---|---|
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part8 이번 달만 색상 진하게 변경하기 (2) | 2022.06.13 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기 (0) | 2022.06.11 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part5 인터페이스 없이 클릭 이벤트 만들기 (0) | 2022.06.10 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트 (0) | 2022.06.09 |
댓글 영역