상세 컨텐츠

본문 제목

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

안드로이드

by aries574 2022. 6. 10. 11:24

본문


이번 시간에는  인터페이스로 클릭 이벤트를 구현한 부분을 인터페이스 없이

구현해보도록 하겠습니다. 

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

2022.06.09 - [분류 전체보기] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상 지정 및 날짜 클릭 이벤트

 

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트

이번 시간에는 토요일은 파란색, 일요일은 빨간색으로, 평일과 다르게 표현하고 클릭하면 해당 날짜를 메시지로 보여주는 기능을 보여주겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니

aries574.tistory.com


목차

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


1. 실행 화면


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

 

- 설명 - 

1. ArrayList<LocalDate?>

String에서 LocalDate로 변경

?null 가능하게함

2. if (day == null)

 넘어온 값이 null이면 빈 값

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

 null이 아니면 값이 있으니 날짜를 가져온다.

 3.        var iYear = day?.year
            var iMonth = day?.monthValue
            var iDay = day?.dayOfMonth

 day(LocalDate)에서 년, 월, 일을 변수에 담는다.

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

 


3. 메인 코드 수정 MainActivity.kt

- 설명 - 

 1. 인터페이스 구현하기 위해 선언한 인터페이스 제거

 2. val adapter = CalendarAdapter(dayList)

   어댑터 생성자에서 this 삭제

 3. dayInMonthArray(date: LocalDate): ArrayList <LocalDate?>

   String -> LocalDate 변경

 4. var dayList = ArrayList <LocalDate?>()

   String -> LocalDate 변경 

 5. dayList.add(null)

   null 추가

6. dayList.add(LocalDate.of(selectedDate.year,
                    selectedDate.monthValue, i - dayOfWeek))

  LocalDate.of(년, 월, 일) 추가

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    //년월 변수
    lateinit var selectedDate: LocalDate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

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

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

        //화면 설정
        setMonthView()

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

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

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

        //날짜 생성해서 리스트에 담기
        val dayList = dayInMonthArray(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 = 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(selectedDate.year,
                    selectedDate.monthValue, i - dayOfWeek))
            }
        }

        return dayList
    }
}

2022.01.16 - [안드로이드] - [안드로이드] 큐알코드(QR CODE) 스캔하는 방법

 

[안드로이드] 큐알코드(QR CODE) 스캔하는 방법

이번 시간에는 큐알코드(QR CODE) 스캔하는 방법에 대해 알아보겠습니다. 목차 1. 실행 화면 2. 라이브러리 등록 3. 권한 등록 4. 스캔 액티비티 추가 ScannerActivity 5. 메인 화면 구성 activity_main.xml 6...

aries574.tistory.com

2021.06.28 - [안드로이드] - [안드로이드] 정해진 시간에 알람 울리는 방법 Notification TimePicker

 

[안드로이드]정해진 시간에 알람 울리는 방법 Notification TimePicker

2020.12.25 - [안드로이드] - [안드로이드]Notification 간단한 알림 띄우기 [안드로이드]Notification 간단한 알림 띄우기 2020/12/24 - [안드로이드] - [안드로이드]DatePicker 달력(캘린더) 만들어보기 이번 시..

aries574.tistory.com

2021.01.19 - [안드로이드] - [안드로이드] DrawerLayout Navigaion 쉽게 만들어보기

 

[안드로이드] DrawerLayout Navigaion 쉽게 만들어보기

2021/01/15 - [안드로이드] - [안드로이드] TextToSpeech 텍스트(Text)를 음성으로 전환시켜주는 방법 2021/01/16 - [안드로이드] - [안드로이드]RecognizerIntent 음성을 텍스트(Text)로 전환시켜주는 방법 2021/..

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역