카테고리 없음

8주차 3일 직렬화 오류와 액티비티 분기

시계속세상은아직돌아가는중 2023. 8. 30. 20:51
    @Parcelize
    enum class TodoContentType:Parcelable {
        ADD, EDIT
    }

    companion object {
        const val EXTRA_MODEL = "extra_model"
        const val CONTENT_TYPE = "content_type"

        fun newIntentForAdd(context: Context) = Intent(context, TodoContentActivity::class.java).apply {
            putExtra(CONTENT_TYPE, TodoContentType.ADD as Parcelable)
        }

        fun newIntentForEdit(context: Context) = Intent(context, TodoContentActivity::class.java).apply {
            putExtra(CONTENT_TYPE, TodoContentType.EDIT as Parcelable)
        }
    }

에서 오류가 발생했다.

 

 putExtra(CONTENT_TYPE, TodoContentType.ADD as Parcelable)
 putExtra(CONTENT_TYPE, TodoContentType.EDIT as Parcelable)

여기서 as Parcelabe을 붙이지 않아서 생긴 문제인 것

 

e: file:///D:/Android/androidadvance/class4_homework/app/src/main/java/com/example/class4_homework/todo/add/TodoContentActivity.kt:25:13 Overload resolution ambiguity: 
public open fun putExtra(p0: String!, p1: Parcelable?): Intent defined in android.content.Intent
public open fun putExtra(p0: String!, p1: Serializable?): Intent defined in android.content.Intent

 

이 오류가 발생하는 이유는 해당 값이 Serialziable과 Paracelabe 모두 받을 수 있기 때문에 충돌이 난 것이다.

따라서 보내줄 형태를 지정해준다면 문제없다.

 

 

선발대 과제를 하면서 하나의 액티비티를 enum class를 사용하여 분기를 나누는 과제가 나왔다.

 

해당 과제는 생각보다 간단한데

 

    @Parcelize
    enum class TodoContentType:Parcelable {
        ADD, EDIT
    }

    companion object {
        const val EXTRA_MODEL = "extra_model"
        const val CONTENT_TYPE = "content_type"

        fun newIntentForAdd(context: Context) = Intent(context, TodoContentActivity::class.java).apply {
            putExtra(CONTENT_TYPE, TodoContentType.ADD as Parcelable)
        }

        fun newIntentForEdit(context: Context) = Intent(context, TodoContentActivity::class.java).apply {
            putExtra(CONTENT_TYPE, TodoContentType.EDIT as Parcelable)
        }
    }

선언을 해준 뒤

 

        if (contentType == TodoContentType.ADD){
            submit.setOnClickListener {
                val intent = Intent().apply {
                    putExtra(
                        EXTRA_MODEL, TodoModel(
                            todoTitle.text.toString(),
                            todoDescription.text.toString()
                        )
                    )
                }
                setResult(Activity.RESULT_OK, intent)
                finish()
            }
        }
        else if(contentType == TodoContentType.EDIT){
            val todoModel = intent.getParcelableExtra<TodoModel>(TodoFragment.ITEM)
            val position = intent.getIntExtra(TodoFragment.POSITION_ITEM,-1)

            toolBar.title = "수정"
            submit.text = "수정 완료"
            todoTitle.setText(todoModel?.title)
            todoDescription.setText(todoModel?.description)

            submit.setOnClickListener {
                val updateTitle = todoTitle.text.toString()
                val updateDescription = todoDescription.text.toString()

                val updateTodoModel: TodoModel = todoModel!!.copy(title = updateTitle, description = updateDescription)

                finish()
            }

        }

if문을 사용하여 쨔잔! 뷰 분기를 나눠줄 수 있다.

 

참으로 간단하면서도 획기적인 기능이 아닐 수 있다.