@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문을 사용하여 쨔잔! 뷰 분기를 나눠줄 수 있다.
참으로 간단하면서도 획기적인 기능이 아닐 수 있다.