상세 컨텐츠

본문 제목

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part8 이번 달만 색상 진하게 변경하기

안드로이드

by aries574 2022. 6. 13. 15:34

본문


이번 시간에는 이전달 날짜와 다음 달 날짜가  현재 달 날짜와 같이 보이기 때문에 

현재 달 날짜를 분간하기 위해서 색상을 다르게 변경해보겠습니다. 

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

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

 

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

이번 시간에는 이번 달(4월) 안에 이전 달(3월)과 다음 달(5월)도 같이 나오게 하는 방법을 알아보겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.06.11 - [안드로이드] - [안드로이드

aries574.tistory.com


목차

1. 실행 화면
2. 공통 클래스 수정 CalendarUtil.kt
3. 메인 코드 수정 MainActivity.kt
4. 날짜 어댑터 수정 CalendarAdapter.kt


1. 실행 화면


2. 공통 클래스 수정 CalendarUtil.kt

 - 설명 -

 LocalDate -> Calendar 변경

class CalendarUtil {
    companion object{
        var selectedDate: Calendar = Calendar.getInstance()
    }
}

 

3. 메인 코드 수정 MainActivity.kt

- 설명 -

 1.기존 Calendar 삭제 

 2.CalendarUtil.selectedDate.add(Calendar.MONTH, -1)

 공통클래스에 있는 selectDate 사용합니다.

 3.monthYearFromDate(calendar: Calendar)

 함수 파라미터도 LocalDate -> Calendar로 변경되었습니다. 

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //binding 초기화
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        
        //화면 설정
        setMonthView()

        //이전달 버튼 이벤트
        binding.preBtn.setOnClickListener {
            //현재 월 -1 변수에 담기
            CalendarUtil.selectedDate.add(Calendar.MONTH, -1)// 현재 달 -1
            setMonthView()
        }

        //다음달 버튼 이벤트
        binding.nextBtn.setOnClickListener {
            CalendarUtil.selectedDate.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(calendar: Calendar): String {

        var year = calendar.get(Calendar.YEAR)
        var month = calendar.get(Calendar.MONTH) + 1

        return "$month 월 $year"
    }
    

    //날짜 생성
    private fun dayInMonthArray(): ArrayList<Date>{

        var dayList = ArrayList<Date>()

        var monthCalendar = CalendarUtil.selectedDate.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
    }
}

 


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

 - 설명 - 

 1. if (iYear == selectYear && iMonth == selectMonth)

   넘어온 날짜(년, 월)와 현재 날짜(년,월)를

    비교해서 색상을 다르게 변경

 2. if (selectDay == dayNo)

   넘어온 날짜(dayNo)와 현재 날짜(selectDay)

   같으면 배경 색상 변경

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()

        //넘어온 날짜
        var iYear = dateCalendar.get(Calendar.YEAR) //년
        var iMonth = dateCalendar.get(Calendar.MONTH) + 1 //월
        var iDay = dateCalendar.get(Calendar.DAY_OF_MONTH)//일


        //현재 날짜
        var selectYear = CalendarUtil.selectedDate.get(Calendar.YEAR) //년
        var selectMonth = CalendarUtil.selectedDate.get(Calendar.MONTH) + 1 //월
        var selectDay = CalendarUtil.selectedDate.get(Calendar.DAY_OF_MONTH) //일


        //넘어온 날짜와 현재 날짜 비교
        if (iYear == selectYear && iMonth == selectMonth) { //같다면 진한 색상상
           holder.dayText.setTextColor(Color.parseColor("#000000"))

            //현재 날짜 비교해서 같다면 배경색상 변경
            if (selectDay == 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)
            }
        } else { //다르다면 연한 색상

            holder.dayText.setTextColor(Color.parseColor("#B4B4B4"))

            //텍스트 색상 지정(토,일)
            if ((position + 1) % 7 == 0) { //토요일은 파랑
                holder.dayText.setTextColor(Color.parseColor("#B4FFFF"))

            } else if (position == 0 || position % 7 == 0) { //일요일은 빨강
                holder.dayText.setTextColor(Color.parseColor("#FFB4B4"))
            }
        }

        //날짜 클릭 이벤트
        holder.itemView.setOnClickListener {

            var yearMonDay = "$iYear 년 $iMonth 월 $iDay 일"

            Toast.makeText(holder.itemView.context, yearMonDay, Toast.LENGTH_SHORT).show()
        }
    }

    override fun getItemCount(): Int {
        return dayList.size
    }
}

2022.05.19 - [안드로이드] - [안드로이드 코틀린] 변수 생성 및 변수 타입 만드는 방법

 

[안드로이드 코틀린] 변수 생성 및 변수 타입 만드는 방법

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

aries574.tistory.com

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

 

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

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

aries574.tistory.com

2022.05.21 - [안드로이드] - [안드로이드 코틀린] 반복문 For 만드는 다양한 방법

 

[안드로이드 코틀린] 반복문 For 만드는 다양한 방법

 이번 시간에는 코틀린에서 반복문으로 쓰이는 For문을 다양하게 만드는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.jav

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역