본문 바로가기

📱/📘Project

[Kotlin] Note 앱 만들기2

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..🧐

'📱 > 📘Project' 카테고리의 다른 글

[Kotlin] Note 앱 만들기4  (0) 2023.01.11
[Kotlin] Note 앱 만들기3  (1) 2023.01.11
[Kotlin] Note 앱 만들기1  (0) 2023.01.09
[Kotlin] TodoList 앱 만들기3  (0) 2023.01.03
[Kotlin] TodoList 앱 만들기2  (2) 2022.12.29