상세 컨텐츠

본문 제목

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part7 달력 표시 변경하기

안드로이드

by aries574 2022. 6. 12. 12:33

본문


이번 시간에는 이번 달(4월) 안에 이전 달(3월)과 다음 달(5월)도 같이 나오게 하는 방법을 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.06.11 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기

 

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기

이번 시간에는 오늘 날짜 배경 색상을 변경해서 표시해주는 방법에 대하여 알아보겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.06.10 - [안드로이드] - [안드로이드 코틀린] 커스

aries574.tistory.com


목차

1. 실행 화면
2. 메인 코드 수정 MainActivity.kt
3. 날짜 어댑터 수정 CalendarAdapter.kt


1. 실행 화면


2. 메인 코드 수정 MainActivity.kt

- 설명 -

 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
    }
}

 


3. 날짜 어댑터 수정 CalendarAdapter.kt

- 설명 - 

 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 - [안드로이드] - [안드로이드 코틀린] 배열 쉽게 만드는 방법

 

[안드로이드 코틀린] 배열 쉽게 만드는 방법

 이번 시간에는 코틀린에서 배열 만드는 방법에 대하여 알아보겠습니다. ​목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.java 1. 실행 화면 2. 메인 ..

aries574.tistory.com

2022.05.31 - [안드로이드] - [Kotlin 코틀린] 간단한 RecyclerView 만드는 방법 part1 - 데이터 & 화면

 

[Kotlin 코틀린] 간단한 RecyclerView 만드는 방법 part1 - 데이터 & 화면

이번 시간에는 코틀린(Kotlin)으로 RecyclerView 리스트 만드는 방법 첫 번째 시간으로 데이터 담을 클래스와 화면을 만들어 보겠습니다. 목차 1. 데이터 클래스 만들기 2. 아이템 화면 만들기 Item

aries574.tistory.com

2022.05.22 - [안드로이드] - [안드로이드 코틀린] 반복문 while, do while 만드는 방법

 

[안드로이드 코틀린] 반복문 while, do while 만드는 방법

이번 시간에는 반복문에 쓰이는 while과 do while문 만드는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.java 1. 실행 ..

aries574.tistory.com

 

 

반응형

관련글 더보기

댓글 영역