๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ/๐Ÿ“˜Project

[Kotlin] Note ์•ฑ ๋งŒ๋“ค๊ธฐ๏ผ”

๋จผ์ € ์‚ญ์ œ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•ด ์คŒ.

 

fragment_detail.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    ...>

    <LinearLayout
        ...>

        ...
        
        <!-- ์ด ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€ -->
        <ImageView
            android:id="@+id/det_delete"
            android:layout_width="25dp"
            android:layout_height="match_parent"
            android:src="@drawable/icon_delete"/>
        
        <Space
            android:layout_width="5dp"
            android:layout_height="match_parent"/>
        
        <!-- ------------- -->
        
        <ImageView
            android:id="@+id/det_edit"
            android:layout_width="25dp"
            android:layout_height="match_parent"
            android:src="@drawable/icon_edit"/>

    </LinearLayout>

    ...

</androidx.constraintlayout.widget.ConstraintLayout>

 

์ด์ œ ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋.

 

DetailFragment.kt
package com.ta2gi.note.fragment

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.ta2gi.note.MainActivity
import com.ta2gi.note.R
import com.ta2gi.note.databinding.FragmentDetailBinding
import com.ta2gi.note.room.NoteEntity
import kotlin.concurrent.thread

class DetailFragment(val mainActivity : MainActivity) : Fragment(), View.OnClickListener {

    lateinit var detailBinding: FragmentDetailBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        detailBinding = FragmentDetailBinding.inflate(inflater)

        detailBinding.detTitle.text = mainActivity.noteDate
        detailBinding.detText.text = mainActivity.noteText

        detailBinding.detCancel.setOnClickListener(this)
        detailBinding.detEdit.setOnClickListener(this)
        detailBinding.detDelete.setOnClickListener(this)

        return detailBinding.root
    }

    override fun onClick(view : View?) {
        when(view) {
            // ๋Œ์•„๊ฐ€๊ธฐ ๋ฒ„ํŠผ
            detailBinding.detCancel -> {
                // ํ™ˆ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด์„œ ํด๋ฆญํ–ˆ๋˜ ๋…ธํŠธ์˜ ์ •๋ณด๋ฅผ ์ดˆ๊ธฐํ™”
                mainActivity.noteUid = null
                mainActivity.noteText = null
                mainActivity.noteDate = null
                mainActivity.noteColor = null

                mainActivity.supportFragmentManager.popBackStack()
            }

            // ์ˆ˜์ •ํ•˜๊ธฐ ๋ฒ„ํŠผ
            detailBinding.detEdit -> mainActivity.fragmentController("edit", true)

            // ์‚ญ์ œ ๋ฒ„ํŠผ
            detailBinding.detDelete -> {
                thread {
                    val entity = NoteEntity(mainActivity.noteUid!!, mainActivity.noteText!!, mainActivity.noteDate!!, mainActivity.noteColor!!)
                    mainActivity.noteDatabase.noteDao().deleteNote(entity)

                    // ๋…ธํŠธ๊ฐ€ ์‚ญ์ œ๋œ์ง€ ์•Œ๋ ค์ฃผ๊ธฐ
                    mainActivity.noteAdapter.notifyDataSetChanged()

                    // ํ™ˆ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด์„œ ํด๋ฆญํ–ˆ๋˜ ๋…ธํŠธ์˜ ์ •๋ณด๋ฅผ ์ดˆ๊ธฐํ™”
                    mainActivity.noteUid = null
                    mainActivity.noteText = null
                    mainActivity.noteDate = null
                    mainActivity.noteColor = null

                    mainActivity.supportFragmentManager.popBackStack()
                }
            }
        }
    }

    // ์ˆ˜์ •ํ•˜๊ณ  ๋Œ์•„์˜จ ํ›„ ์ˆ˜์ •๋œ ํ…์ŠคํŠธ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•œ ์šฉ๋„
    override fun onResume() {
        super.onResume()

        detailBinding.detText.text = mainActivity.noteText
    }
}

 

๋๋‚ด๋ ค ํ–ˆ์ง€๋งŒ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋…ธํŠธ ์ถ”๊ฐ€์™€ ์ˆ˜์ • ์‹œ์— ๊ณต๋ฐฑ์„ ์ž…๋ ฅํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ–ˆ์Œ.

trim()์€ ๋ฌธ์ž์—ด ์•ž, ๋’ค์˜ ๊ณต๋ฐฑ์„ ๋ชจ๋‘ ์—†์• ์ฃผ๊ณ 

.isEmpty()๋Š” ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ๋ฅผ ๋œป ํ•จ.

 

AddFragment.kt
package com.ta2gi.note.fragment

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.snackbar.Snackbar
import com.ta2gi.note.MainActivity
import com.ta2gi.note.room.NoteEntity
import com.ta2gi.note.databinding.FragmentAddBinding
import java.text.SimpleDateFormat
import java.util.*
import kotlin.concurrent.thread

class AddFragment(val mainActivity : MainActivity) : Fragment(), View.OnClickListener {

    lateinit var addBinding : FragmentAddBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        addBinding = FragmentAddBinding.inflate(inflater)

        addBinding.addCancel.setOnClickListener(this)
        addBinding.addComplete.setOnClickListener(this)

        return addBinding.root
    }

    override fun onClick(view : View?) {
        when(view) {
            // ๋Œ์•„๊ฐ€๊ธฐ ๋ฒ„ํŠผ
            // ์ด์ „์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
            addBinding.addCancel -> mainActivity.supportFragmentManager.popBackStack()

            // ์™„๋ฃŒ ๋ฒ„ํŠผ
            addBinding.addComplete -> {
                // ํ…์ŠคํŠธ์— ์ ํžŒ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ
                val editText = addBinding.addEdittext.text.toString().trim()

                // ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ
                if(editText.isEmpty()) {
                    mainActivity.hideKeyboard(mainActivity)
                    Snackbar.make(addBinding.root, "โ—๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”", Snackbar.LENGTH_SHORT).show()
                    return
                }

                // ์˜ค๋Š˜ ๋‚ ์งœ ๊ฐ€์ ธ์˜ค๊ธฐ(์ž‘์„ฑ์ผ)
                val sdf = SimpleDateFormat("yyyy.MM.dd", Locale.KOREAN)
                val date =  sdf.format(System.currentTimeMillis())

                // ๋…ธํŠธ ์ƒ‰์ƒ ์ •ํ•˜๊ธฐ
                val noteColor = mainActivity.noteColor()

                // ๋…ธํŠธ ์ •๋ณด ๊ฐ์ฒด์— ๋„ฃ๊ธฐ
                val entity = NoteEntity(null, editText, date, noteColor)
                // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋…ธํŠธ ์ถ”๊ฐ€
                thread {
                    mainActivity.noteDatabase.noteDao().insertNote(entity)

                    // ์–ด๋Žํ„ฐ์— ๋ฆฌ์ŠคํŠธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์•Œ๋ ค์ฃผ๊ณ  ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ
                    mainActivity.noteAdapter.notifyDataSetChanged()
                    mainActivity.hideKeyboard(mainActivity)

                    mainActivity.supportFragmentManager.popBackStack()
                }
            }
        }
    }
}

 

EditFragment.kt
package com.ta2gi.note.fragment

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.snackbar.Snackbar
import com.ta2gi.note.MainActivity
import com.ta2gi.note.room.NoteEntity
import com.ta2gi.note.databinding.FragmentEditBinding
import kotlin.concurrent.thread

class EditFragment(val mainActivity : MainActivity) : Fragment(), View.OnClickListener {

    lateinit var editBinding : FragmentEditBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        editBinding = FragmentEditBinding.inflate(inflater)

        // ์ˆ˜์ •ํ•  ํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
        editBinding.ediEdittext.setText(mainActivity.noteText)

        editBinding.ediCancel.setOnClickListener(this)
        editBinding.ediComplete.setOnClickListener(this)

        return editBinding.root
    }

    override fun onClick(view : View?) {
        when(view) {
            // ๋Œ์•„๊ฐ€๊ธฐ ๋ฒ„ํŠผ
            editBinding.ediCancel -> mainActivity.supportFragmentManager.popBackStack()

            // ์™„๋ฃŒ ๋ฒ„ํŠผ
            editBinding.ediComplete -> {
                // ํ…์ŠคํŠธ์— ์ ํžŒ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ
                val editText = editBinding.ediEdittext.text.toString().trim()

                // ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ
                if(editText.isEmpty()) {
                    mainActivity.hideKeyboard(mainActivity)
                    Snackbar.make(editBinding.root, "โ—๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”", Snackbar.LENGTH_SHORT).show()
                    return
                }

                // ์ˆ˜์ •ํ•œ ๋…ธํŠธ ์ •๋ณด ๊ฐ์ฒด์— ๋„ฃ๊ธฐ
                val entity = NoteEntity(mainActivity.noteUid!!, editText, mainActivity.noteDate!!, mainActivity.noteColor!!)
                thread {
                    mainActivity.noteDatabase.noteDao().updateNote(entity)

                    // ์™„๋ฃŒํ•˜๊ณ  ๋Œ์•„๊ฐˆ ๋•Œ ํ”„๋ž˜๊ทธ๋จผํŠธ ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•œ ํ…์ŠคํŠธ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ
                    mainActivity.noteText = editText

                    // ์–ด๋Žํ„ฐ์— ๋ฆฌ์ŠคํŠธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์•Œ๋ ค์ฃผ๊ณ  ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ
                    mainActivity.noteAdapter.notifyDataSetChanged()
                    mainActivity.hideKeyboard(mainActivity)

                    mainActivity.supportFragmentManager.popBackStack()
                }
            }
        }
    }
}

 

์—ฌ๊ธฐ๊นŒ์ง€ Note ์•ฑ ๋งŒ๋“ค๊ธฐ์˜€์Œ.

 

โ€ป ์–ด๋Žํ„ฐ์˜ ๋‚ด์šฉ ๋ณ€๊ฒฝ์„ ์•Œ๋ ค์ฃผ๋Š” notifyDataSetChanged()๋ฅผ ๋ชจ๋‘ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ•ด๋„ ์ž˜ ๋œ๋‹ค. ์™œ ๊ทธ๋Ÿฐ์ง€๋Š” ๋‚˜๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค.

 

The End..๐Ÿ˜ต