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

๐Ÿ“ฑ/๐Ÿ“˜Project

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

ViewBinding์„ ์ถ”๊ฐ€ํ•ด ์คŒ.

 

build.gradle (module)
android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

 

๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ ์ถ”๊ฐ€, ์ƒ์„ธํ™”๋ฉด, ์ˆ˜์ •์˜ ๊ธฐ๋Šฅ๋“ค์„ ๋งŒ๋“ค์—ˆ์Œ.

์„ค๋ช…์€ ์ฃผ์„์œผ๋กœ ๋‹ค ํ•ด๋†จ์Œ.

 

HomeFragment.kt
package com.ta2gi.note.fragment

import android.os.Bundle
import android.util.Log
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.FragmentHomeBinding

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

    lateinit var homeBinding : FragmentHomeBinding

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

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

        // ์–ด๋ށํ„ฐ ๋ผ์šฐ๊ธฐ
        homeBinding.homRecyclerview.adapter = mainActivity.noteAdapter

        // ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” ์นœ๊ตฌ๋“ค์€ setOnClickListener๋ฅผ ๋‹ฌ์•„์ค˜์•ผ ํ•จ
        homeBinding.homAdd.setOnClickListener(this)

        return homeBinding.root
    }

    override fun onClick(view : View?) {
        when(view) {
            // ์ถ”๊ฐ€ ๋ฒ„ํŠผ
            // +๋ฅผ ๋ˆ„๋ฅด๋ฉด AddFragment๋กœ ์ด๋™
            homeBinding.homAdd -> mainActivity.fragmentController("add", true)
        }
    }
}

 

AddFragment.kt
package com.ta2gi.note.fragment

import android.os.Bundle
import android.util.Log
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.NoteEntity
import com.ta2gi.note.R
import com.ta2gi.note.databinding.FragmentAddBinding
import java.text.SimpleDateFormat
import java.util.*

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()

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

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

                // ๋…ธํŠธ ์ •๋ณด ๊ฐ์ฒด์— ๋„ฃ๊ธฐ
                val entity = NoteEntity(editText, date, noteColor)
                // ๋ฆฌ์ŠคํŠธ์— ์ž‘์„ฑํ•œ ๋…ธํŠธ ์ถ”๊ฐ€
                mainActivity.noteList.add(entity)

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

                mainActivity.supportFragmentManager.popBackStack()
            }
        }
    }
}

 

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

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)

        return detailBinding.root
    }

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

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

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

        detailBinding.detText.text = mainActivity.noteText
    }
}

 

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.ta2gi.note.MainActivity
import com.ta2gi.note.NoteEntity
import com.ta2gi.note.R
import com.ta2gi.note.databinding.FragmentEditBinding
import java.text.SimpleDateFormat
import java.util.*

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()

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

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

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

                mainActivity.supportFragmentManager.popBackStack()
            }
        }
    }
}

 

NoteAdapter.kt
package com.ta2gi.note

import android.content.res.ColorStateList
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class NoteAdapter(val mainActivity : MainActivity, val noteList : MutableList<NoteEntity>) : RecyclerView.Adapter<NoteAdapter.ViewHolderClass>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteAdapter.ViewHolderClass {
        // ํ•ญ๋ชฉ์˜ layout์€ R.layout.list_item
        val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)

        return ViewHolderClass(view)
    }

    override fun onBindViewHolder(holder: NoteAdapter.ViewHolderClass, position: Int) {
        // ๋…ธํŠธ ๋‚ด์šฉ ๋„ฃ๊ธฐ
        holder.note.text = noteList[position].note
        // ๋…ธํŠธ ์ƒ‰์ƒ ๋„ฃ๊ธฐ
        holder.background.backgroundTintList = ColorStateList.valueOf(Color.parseColor(noteList[position].color))

        holder.note.setOnClickListener {
            // ํด๋ฆญํ•œ ๋…ธํŠธ ์ •๋ณด ๋‹ด๊ณ  ํ”„๋ž˜๊ทธ๋จผํŠธ ์ด๋™
            mainActivity.noteText = holder.note.text.toString()
            mainActivity.noteDate = noteList[position].date
            mainActivity.noteColor = noteList[position].color
            mainActivity.fragmentController("detail", true)
        }
    }

    override fun getItemCount(): Int {
        // ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ธด ํ•ญ๋ชฉ์˜ ํฌ๊ธฐ๋งŒํผ ๋‚˜์˜ค๊ฒŒํ•˜๊ธฐ
        return noteList.size
    }

    inner class ViewHolderClass(view : View) : RecyclerView.ViewHolder(view) {
        val background = view.findViewById<LinearLayout>(R.id.ite_layout)
        val note = view.findViewById<TextView>(R.id.ite_text)
    }
}

 

NoteEntity.kt
package com.ta2gi.note

data class NoteEntity(
    val note : String,
    val date : String,
    val color : String
)

 

์œ„ ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์ž˜ ๋จ. (์•ˆ๋œ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ ค์š”!)

 

๊ทผ๋ฐ ์ˆ˜์ •์„ ํ•˜๊ณ ๋‚˜์„œ ํ™ˆ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„์™€ ๋ณด๋ฉด ๋ฐ”๋€Œ์ง€ ์•Š์Œ.

ํ•ด๋‹น ๋…ธํŠธ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ฐ์ฒด๋ฅผ ๋”ฐ๋กœ ์ฐพ์„ ์ˆ˜ ์—†์Œ.

๊ทธ๋ฆฌ๊ณ  ๋…ธํŠธ ์ž‘์„ฑ ํ›„ ์•ฑ์„ ์ข…๋ฃŒ ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค ์‚ฌ๋ผ์ ธ ์žˆ์Œ!

์ฐพ์œผ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ๋“  ์ฐพ๊ฒ ์ง€๋งŒ ๊ท€์ฐฎ์œผ๋‹ˆ ์–ผ๋ฅธ Room์„ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•ด๋ณด๊ฒ ์Œ.

 

To be Continued..๐Ÿง