개발노트/Kotlin
8주차 5일 fragment와 액티비티등
시계속세상은아직돌아가는중
2023. 9. 1. 21:13
package com.example.class4_homework
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.example.class4_homework.databinding.TodoAddActivityBinding
import kotlinx.parcelize.Parcelize
import androidx.appcompat.app.AlertDialog
class TodoContentActivity : AppCompatActivity() {
@Parcelize
enum class TodoContentType : Parcelable {
ADD, EDIT
}
companion object {
const val EXTRA_MODEL = "extra_model"
const val EXTRA_CONTENT_TYPE_ADD = "content_type_add"
const val EXTRA_CONTENT_TYPE_EDIT = "content_type_edit"
const val EXTRA_INDEX = "extra_index"
const val EXTRA_ISREMOVE = "extra_isRemove"
fun newIntentForAdd(context: Context) =
Intent(context, TodoContentActivity::class.java).apply {
putExtra(EXTRA_CONTENT_TYPE_ADD, TodoContentType.ADD as Parcelable)
}
fun newIntentForEdit(context: Context) =
Intent(context, TodoContentActivity::class.java).apply {
putExtra(EXTRA_CONTENT_TYPE_EDIT, TodoContentType.EDIT as Parcelable)
}
}
private lateinit var binding: TodoAddActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = TodoAddActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
initView()
}
private fun initView() = with(binding) {
toolBar.setNavigationOnClickListener {
finish()
}
val contentTypeADD = intent.getParcelableExtra(EXTRA_CONTENT_TYPE_ADD) as? TodoContentType
val contentTypeEDIT = intent.getParcelableExtra(EXTRA_CONTENT_TYPE_EDIT) as? TodoContentType
val todoModel = intent?.getParcelableExtra<TodoModel>(TodoFragment.EXTRA_ITEM) as? TodoModel
val position = intent.getIntExtra(TodoFragment.EXTRA_POSITION_ITEM, -1)
var isRemove = false
//contentTypeEDIT
if (contentTypeEDIT != null) {
remove.visibility = View.VISIBLE
//레이아웃 설정
if (todoModel != null) {
toolBar.title = "수정"
submit.text = "수정 완료"
todoTitle.setText(todoModel.title)
todoDescription.setText(todoModel.description)
}
//삭제버튼
remove.setOnClickListener {
val builder = AlertDialog.Builder(this@TodoContentActivity)
builder.setMessage("할 일을 삭제할까요?")
builder.setPositiveButton("삭제") { _, _ ->
isRemove = true
val intentRemove = Intent().apply {
putExtra(EXTRA_INDEX,position)
putExtra(EXTRA_ISREMOVE,isRemove)
}
setResult(Activity.RESULT_OK,intentRemove)
finish()
}
builder.setNegativeButton("취소") { dialog, _ ->
dialog.dismiss()
}
val dialog = builder.create()
dialog.show()
}
}
//확인버튼
submit.setOnClickListener {
val intent = Intent().apply {
putExtra(
EXTRA_MODEL, TodoModel(
todoTitle.text.toString(),
todoDescription.text.toString()
)
)
if (contentTypeEDIT != null) {
putExtra(EXTRA_INDEX, position)
}
}
setResult(Activity.RESULT_OK, intent)
finish()
}
}
}
package com.example.class4_homework
import android.app.Activity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.Fragment
import com.example.class4_homework.databinding.TodoFragmentBinding
class TodoFragment : Fragment() {
companion object {
fun newInstance() = TodoFragment()
const val EXTRA_ITEM = "extra_item"
const val EXTRA_POSITION_ITEM = "extra_position"
}
private var _binding: TodoFragmentBinding? = null
private val binding get() = _binding!!
val listAdapter by lazy {
TodoListAdapter()
}
private val editTodoLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val todoModelEdit =
result.data?.getParcelableExtra(TodoContentActivity.EXTRA_MODEL) as? TodoModel
val index = result.data?.getIntExtra(TodoContentActivity.EXTRA_INDEX, -1) as Int
val isRemove = result.data?.getBooleanExtra(
TodoContentActivity.EXTRA_ISREMOVE,
false
) as Boolean
Toast.makeText(activity, "${index}", Toast.LENGTH_SHORT).show()
if (index == -1) {
Toast.makeText(activity, "존재하지 않는 항목에 접근하였습니다.", Toast.LENGTH_SHORT).show()
return@registerForActivityResult
}
if (isRemove) listAdapter.itemRemove(index)
else listAdapter.itemChanged(todoModelEdit, index)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = TodoFragmentBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
}
private fun initView() = with(binding) {
todoList.adapter = listAdapter
listAdapter.itemClick = object : TodoListAdapter.ItemClick {
override fun onClick(view: View, position: Int) {
val item = listAdapter.getItemAtPosition(position)
val intent = TodoContentActivity.newIntentForEdit(requireContext()).apply {
putExtra(EXTRA_ITEM, item)
putExtra(EXTRA_POSITION_ITEM, position)
}
editTodoLauncher.launch(intent)
}
}
}
fun setDodoContent(todoModel: TodoModel?) {
listAdapter.addItem(todoModel)
}
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
}
삭제하는 로직이 추가되고 enum class활용을 제대로 한?건지는 모르겠다.
isRemove로 삭제 판정을 받고 fragment에서 삭제할 수 있는지에 대한 판단을 받는다.