상세 컨텐츠

본문 제목

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

안드로이드

by aries574 2022. 6. 11. 11:21

본문


이번 시간에는 오늘 날짜 배경 색상을 변경해서 표시해주는 방법에 대하여 알아보겠습니다.

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

2022.06.10 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part 5 인터페이스 없이 클릭 이벤트 만들기

 

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part5 인터페이스 없이 클릭 이벤트 만들기

이번 시간에는 인터페이스로 클릭 이벤트를 구현한 부분을 인터페이스 없이 구현해보도록 하겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.06.09 - [분류 전체보기] - [안드로이드

aries574.tistory.com


목차

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


1. 실행 화면


2. 공통 클래스 만들기 CalendarUtil.kt

 - 설명 - 

 공통으로 사용하기 위해 구현

class CalendarUtil {
    companion object{
        var selectedDate: LocalDate = LocalDate.now()
    }
}

 

 

3. 메인 코드 수정 MainActivity.kt

 - 설명 -

 기존 selectedDateCalendarUtilselectedDate 사용

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)

        //현재 날짜
        CalendarUtil.selectedDate  = LocalDate.now()

        //화면 설정
        setMonthView()

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

        //다음달 버튼 이벤트
        binding.nextBtn.setOnClickListener {
            CalendarUtil.selectedDate = CalendarUtil.selectedDate.plusMonths(1)
            setMonthView()
        }
    }

    //날짜 화면에 보여주기
    private fun setMonthView() {
        //년월 텍스트뷰 셋팅
        binding.monthYearText.text = monthYearFromDate(CalendarUtil.selectedDate)

        //날짜 생성해서 리스트에 담기
        val dayList = dayInMonthArray(CalendarUtil.selectedDate)

        //어댑터 초기화
        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(date: LocalDate): ArrayList<LocalDate?>{

        var dayList = ArrayList<LocalDate?>()

        var yearMonth = YearMonth.from(date)

        //해당 월 마지막 날짜 가져오기(예: 28, 30, 31)
        var lastDay = yearMonth.lengthOfMonth()

        //해당 월의 첫 번째 날 가져오기(예: 4월 1일)
        var firstDay = CalendarUtil.selectedDate.withDayOfMonth(1)

        //첫 번째날 요일 가져오기(월:1, 일: 7)
        var dayOfWeek = firstDay.dayOfWeek.value

        for(i in 1..41){
            if(i <= dayOfWeek || i > (lastDay + dayOfWeek)){
                dayList.add(null)
            }else{
                //LocalDate.of(년, 월, 일)
                dayList.add(LocalDate.of(CalendarUtil.selectedDate.year,
                    CalendarUtil.selectedDate.monthValue, i - dayOfWeek))
            }
        }

        return dayList
    }
}

 

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

 - 설명 - 

if(day == CalendarUtil.selectedDate)

MainActivity에서 받아온 날짜를 공통 selectedDate

비교해서 현재 날짜에 배경색상을 변경합니다.

class CalendarAdapter(private val dayList: ArrayList<LocalDate?>):
    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 day = dayList[holder.adapterPosition]


        if(day == null){
            holder.dayText.text = ""
        }else{
            //해당 일자를 넣는다.
            holder.dayText.text = day.dayOfMonth.toString()

            //현재 날짜 색상 칠하기
            if(day == CalendarUtil.selectedDate){
                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 = day?.year
            var iMonth = day?.monthValue
            var iDay = day?.dayOfMonth

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

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

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

2022.05.25 - [안드로이드] - [안드로이드 코틀린] 함수(function) 만드는 방법 part1 - 매개변수(parameter)

 

[안드로이드 코틀린] 함수(function) 만드는 방법 part1 - 매개변수(parameter)

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

aries574.tistory.com

2022.05.27 - [안드로이드] - [안드로이드 코틀린] 함수(function) 만드는 방법 part3 - 단일 표현식

 

[안드로이드 코틀린] 함수(function) 만드는 방법 part3 - 단일 표현식

이번 시간에는 return 함수를 간단하게 표현하는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.java 1. 실행 화면 2. 메..

aries574.tistory.com

2022.05.30 - [안드로이드] - [안드로이드 코틀린] 함수(function) 만드는 방법 part6 - 가변 인자(vararg) & 스프레드 연산자(spread operator)

 

[안드로이드 코틀린] 함수(function) 만드는 방법 part6 - 가변 인자(vararg) & 스프레드 연산자(spread oper

이번 시간에는 함수에 가변 인자(vararg)와 스프레드 연산자(spread operator) 를 사용하는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현..

aries574.tistory.com

반응형

관련글 더보기

댓글 영역