본문 바로가기

개발 노트/Kotlin

[kotlin] putExtra로 key값 전달!!

댓글 기능을 만드는 작업을 하는중에

해당하는 게시물의 key값을 가져와서 파이어베이스에 저장하는 작업이 필요했다

 

recipecomment

    - recipeboardkey (레시피 게시물에 해당하는 key값)

         - recipecommentkey(임의의 값)

             - 데이터모델(내가 작성한 댓글값)

 

이런형태로 파이어베이스에 들어가길 원했다 

 

그런데 여기서 recipeboardkey를 가져오는 부분에서 막혀버렸었다

내가 댓글을 입력할 엑티비티는 다른 엑티비티인데 레시피 게시물에 해당하는 key값을 어떻게 가져오느냐..에 대한것이 문제였다...

 

 

일단 내 앱의 구조는 아래 영상과 같다

해당하는 리사이클러뷰를 클릭하면 게시물내부로 이동하고 거기서 댓글을 클릭하는 구조이다

즉, RecipebookFragment에서 리사이클러뷰 아이템을 클릭하면, RecipeInsideActivity로 이동하고, 여기서 댓글을 클릭하면 RecipeCommentActivity로 이동한다

 

 

 

방법은 엑티비티로 이동할때(Intent될때) putExtra를 사용해서 key값을 넘겨주는것이다!!!

근데 한 엑티비티로만 넘겨봤지,,, 여러 엑티비티 연속으로? 사용하는것은 생각을 못해봤다...

 

즉, RecipebookFragment에서 리사이클러뷰 아이템클릭하면 RecipeInsideActivity로 이동하는데 이때 key값을 넘겨준다.

RecipeInsideActivity에서는 넘겨준 이 키값을 getExtra()로 받아온다

이제 RecipeInsideActivity에서도 댓글부분을 클릭하면 댓글화면이 나오는 엑티비티( RecipeCommentActivity )로 이동해야되기 때문에 이동할때 또 키값을 넘겨준다

이제 RecipeCommentActivity에서는 이 키값을 getExtra()로 받아오면 된다 

 

RecipeCommentActivity에서 받아온 키값이 우리가 알고자했던 recipeboardkey가 되는것이기 때문에 이걸 사용해주면된다

 

 

 

좀더 자세하게 코드로 보면

// 리사이클러뷰 아이템 클릭시
recipeRVAdapter.setRecipeClickListner(object : RecipeRVAdapter.RecipeClickListner{

    override fun onItemClick(position: Int) {

        // RecipeInsideActivity로 이동
        val intent = Intent(context, RecipeInsideActivity::class.java)

        // 클릭한 key값의 위치 넘겨줌 (리사이클러뷰 아이템 클릭할때 클릭한 키값의 위치도 함께 넘겨줌)
        // recipename, foodmeterial, recipe, uid, time (레시피이름, 레시피재료, 요리 레시피, uid, 현재시간)값 넘겨줌
        intent.putExtra("key", recipeKeyList[position])

        startActivity(intent)

    }
})

RecipebookFragment.kt

 

1) RecipeInsideActivity로 이동할때 같이 키값을 넘겨준다 

 

 

 

// RecipeBookFragment에서 보낸 key데이터 받아오기
key = intent.getStringExtra("key").toString()

RecipeInsideActivity.kt

 

2) RecipeInsideActivity에서는 RecipebookFragment에서 넘겨준 key값을 받아온다

 

 

// commentIV 클릭했을때 RecipeCommentActivity으로 이동
binding.commentIV.setOnClickListener {

    val intent = Intent(this,RecipeCommentActivity ::class.java)
    // RecipeCommentActivity로 키값 넘겨줌
    // (댓글입력할때 RecipebookFragment의 키값을 받아와야되므로 (레시피게시글의 키값) 키값 무조건 넘겨주기!!!)
    intent.putExtra("key", key)

    startActivity(intent)
}

RecipeInsideActivity.kt

 

3) 댓글 클릭했을때 댓글창이 나오는 RecipeCommentActivity로 넘어갈때도 똑같이 키값을 넘겨준다

 

 

    // RecipeInsideActivity에서 넘긴 key값 받아옴
    // 댓글입력할떄 이 key값 꼭 받아오기!!!! (레시피 게시물의 key값을 가져와야되기 때문)
    key = intent.getStringExtra("key").toString()


    // 댓글 입력버튼 눌렀을때
    binding.commentBtn1.setOnClickListener {

        insertRecipeComment(key)
    }

}


// 파이어베이스에 입력한 댓글 저장하는 함수
fun insertRecipeComment(key : String){

    FBRef.commentRecipeRef  // recipecomment
        .child(key)         // recipeboardKey
        .push()             // recipecommentkey(임의의값)
        .setValue(RecipeCommentModel(binding.commentArea3.text.toString())) // 내가 입력한 댓글값(RecipecommentTitle)

    Toast.makeText(this, "댓글 입력완료", Toast.LENGTH_SHORT).show()

    // 텍스트 지워줌
    binding.commentArea3.setText("")

}

RecipeCommentActivity.kt

 

4) RecipeInsideActivity에서 넘겨준 키값을 받아오고, 댓글 입력버튼을 눌렀을때 파이어베이스에 입력한 댓글이 저장되도록 코드를 짜준다

 

// 파이어베이스에 recipecomment 추가 (레시피게시물 안에 댓글)
val commentRecipeRef = database.getReference("recipecomment")

FBRef.kt

 

먼저 나는 FBRef라는 파일에 위에 코드를 추가해서 파이어베이스에 recipecomment가 추가되도록 했고, 

child(key)를 사용해서 아까까지 받아왔던 레시피게시물에 해당하는 key값을 가져온다

그리고 push를 사용해서 임의의 값을 넣어준뒤, setValue로 내가 입력한 댓글값을 넣어준다

 

 

그러면 이런 형식이 나오는것을 확인할수있다

 

recipecomment

    - recipeboardkey (레시피 게시물에 해당하는 key값)

         - recipecommentkey(임의의 값)

             - 데이터모델(내가 작성한 댓글값)

 

 

댓글을 입력한 후 파이어베이스를 보면 예상한대로 잘 들어간것을 볼수있다

 

 

 

 

 

우리가 찾고자했던 레시피게시물에 해당하는 key값도 실제 레시피게시물에 해당하는 key값과 일치하는것을 확인할수있다!!

 

 

 

 

댓글기능을 구현할때는 해당하는 게시물의 값전체를 가져와야한다

댓글을 작성하는 게시물이 각각 다르기 때문이다? (설명을 못하겠다,,,,) 

일단 나는 게시물을 만들때 애초에 그걸 키값으로 설정해놨기때문에 이렇게 구현한것이다