[Android] Unit 타입 사용 + 개발일지

[개발 일지]

 

<Kotlin으로 개발하는 한 달 일정 관리 앱 개발>

 

필요 기능!

 

1. 새로운 데이터 추가 시 즉시 캘린더에 일정 icon 추가

2. 캘린더에 일정이 하나라도 있으면 일정 icon 나타내기

 

Slide View에서 새로운 일정 추가 시 즉시 달력에 표시하는 기능이 필요했다.

 

방법으로는 새로운 데이터를 추가하면  key 값을 Unit() 타입을 사용해서 

Slide View를 띄운 Fragment로 전송해주고, 해당 Fragment에 adapter로 연결된 Recycler View에

icon을 나타내는 데이터를 갱신해주는 것이었다.

 

우선 새로 데이터를 추가할 때 icon이 나타나도록  코드를 작성했다.

달력의 하루를 나타내는 item_calendar.xml 레이아웃에 imageView를 추가했다.

아래의 이미지 뷰는 일정이 있는 날짜에 일정 아이콘을 나타낼 이미지 뷰이다.

기본 설정으로 invisible을 해서 기본 값을 보이지 않음으로 했다.

 

<ImageView
    android:visibility="invisible"
    android:src="@drawable/ic_iconmonstr_tiles_list_lined"
    android:layout_marginStart="5dp"
    android:id="@+id/is_it_todo"
    android:layout_width="@dimen/fab_margin"
    android:layout_height="match_parent"/>

 

 

slide를 띄운 View에서 데이터의 추가가 발생한다.

 

class CalendarSlider(
    slideLayout: SlideLayoutCalendarBinding,
    private val mainActivity: MainActivity,
    private val onAddData:()->Unit,
)

 

Slide를 띄우는 View에서 onAddData를 Unit 함수로 선언했다.

Unit 함수는 반환 값이 없다는 의미로 자바의 void와 같은 기능을 한다.

 

private fun addTypeData(){
    mainActivity.viewModel.addTodoData(keyDay,editTypingView.text.toString())
    editTypingView.setText("")
    val imm = mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(mainActivity.currentFocus?.windowToken,0)

    onAddData.invoke()
}

 

새로운 데이터가 추가되는 부분에서 onAddData를 invoke 해준다.

이제 slide 뷰를 사용하는 부분에서 onAddData를 처리해준다.

 

val calendarSlider =
    CalendarSlider(slideLayout, mainActivity, onAddData = {
        val iconView = view.findViewById<ImageView>(R.id.is_it_todo)
        if (iconView.visibility==View.INVISIBLE){
            iconView.visibility = View.VISIBLE
        }
    })

 

새로운 데이터가 추가될 시 onAddData가 호출되고, 

Class를 연결한 부분에서 해당 데이터에 대한 값을 처리한다.

 

val position = rv.getChildAdapterPosition(child)
val view = rv.layoutManager?.findViewByPosition(position)

 

위에서 view는 Recycler View의 position에 해당하는 view로 이전에 작성한 item_calendar.xml 레이아웃이다.

 

이제 새로운 데이터 추가 시 해당 날짜에 달력 아이콘이 나타나게 된다.

기존에 있는 데이터에 대한 일정 icon도 필요하며, 사용자가 일정을 삭제했을 때 icon이 사라지게도 해야 한다.

 

//달력에 일정 아이콘 표시 여부
val key = dateTime+" "+ holder.binding.calendarText.text.toString()+"일"

if (mainActivity.viewModel.todoData[key]!=null){
    holder.binding.isItTodo.visibility = View.VISIBLE
}

 

key값을 가져와서 viewModel에 해당 key 값이 있다면 icon 이미지를 VISIBLE 해준다.

 

위와 같이 코드를 작성하였더니 일정이 없을 때 icon이 보이지 않는 설정을 하지 않아서 다시 수정했다.

 

if (mainActivity.viewModel.todoData[key] != null) {
    if (mainActivity.viewModel.todoData[key]!!.size > 0) {
        holder.binding.isItTodo.visibility = View.VISIBLE
    } else {
        holder.binding.isItTodo.visibility = View.INVISIBLE
    }
}

 

key에 해당하는 데이터의 크기가 0보다 크다면 해당 날짜에 todo 데이터가 하나라도 있는 것이다.

이 경우에는 icon image view를 나타내고, 아니라면 view를 숨겨준다.

 

 

이제 일정 추가 시 icon이 생긴다.