개발노트/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에서 삭제할 수 있는지에 대한 판단을 받는다.