inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)

게시글 수정 만들기 - 2

이미지도 수정하고 싶어서 수정을 해봤습니다.

524

monk

작성한 질문수 1

0

BoardWriteActivity 부분에 있던 이미지를 넣는 코드들(imageUpload 함수, onActivityResult 함수)을 그대로 복사해서 BoardEditActivity에 붙여넣기를 했습니다.

 

수정 화면에서 이미지를 클릭했을 때 기존 WriteActivity에서 이미지를 추가했을 때와 같이 나오고

에러도 없이 실행이 되는데 이렇게 하는게 맞는건가 싶어서 질문드립니다!

 

package com.example.mysolelife.board

import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.bumptech.glide.Glide
import com.example.mysolelife.R
import com.example.mysolelife.databinding.ActivityBoardEditBinding
import com.example.mysolelife.utils.FBAuth
import com.example.mysolelife.utils.FBRef
import com.google.android.gms.tasks.OnCompleteListener
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.google.firebase.ktx.Firebase
import com.google.firebase.storage.ktx.storage
import java.io.ByteArrayOutputStream

class BoardEditActivity : AppCompatActivity() {

    private lateinit var key: String

    private lateinit var binding: ActivityBoardEditBinding

    private val TAG = BoardEditActivity::class.java.simpleName

    private lateinit var writerUid: String

    private var isImageUpload = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_board_edit)

        key = intent.getStringExtra("key").toString()
        getBoardData(key)
        getImageData(key)

        binding.editBtn.setOnClickListener {
            editBoardData(key)

            if (isImageUpload) {
                imageUpload(key)
            }
        }

        binding.imageArea.setOnClickListener {
            val gallery = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI)
            startActivityForResult(gallery, 100)
            isImageUpload = true
        }
    }

    private fun editBoardData(key: String) {
        // 게시글 t
        FBRef.boardRef
            .child(key)
            .setValue(
                BoardModel(
                    binding.titleArea.text.toString(),
                    binding.contentArea.text.toString(),
                    writerUid,
                    FBAuth.getTime()
                )
            )
        Toast.makeText(this, "수정완료", Toast.LENGTH_LONG).show()
        finish()
    }

    private fun imageUpload(key: String) {
        // Get the data from an ImageView as bytes

        val storage = Firebase.storage
        // Create a storage reference from our app
        val storageRef = storage.reference
        // Create a reference to "mountains.jpg"
        val mountainsRef = storageRef.child("${key}.png")

        val imageView = binding.imageArea
        imageView.isDrawingCacheEnabled = true
        imageView.buildDrawingCache()
        val bitmap = (imageView.drawable as BitmapDrawable).bitmap
        val baos = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val data = baos.toByteArray()

        var uploadTask = mountainsRef.putBytes(data)
        uploadTask.addOnFailureListener {
            // Handle unsuccessful uploads
        }.addOnSuccessListener { taskSnapshot ->
            // taskSnapshot.metadata contains file metadata such as size, content-type, etc.
            // ...
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK && requestCode == 100) {
            binding.imageArea.setImageURI(data?.data)
        }
    }

    private fun getImageData(key: String) {
        // Reference to an image file in Cloud Storage
        val storageReference = Firebase.storage.reference.child("${key}.png")

        // ImageView in your Activity
        val imageViewFromFB = binding.imageArea

        storageReference.downloadUrl.addOnCompleteListener(OnCompleteListener { task ->
            if (task.isSuccessful) {
                Glide.with(this)
                    .load(task.result)
                    .into(imageViewFromFB)
            } else {

            }
        })
    }

    private fun getBoardData(key: String) {
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                // 데이터를 하나만 가져오면 되므로 반복문 사용이 필요 없다.
                val dataModel = dataSnapshot.getValue(BoardModel::class.java)
                Log.d(TAG, dataModel!!.title)

                binding.titleArea.setText(dataModel.title)
                binding.contentArea.setText(dataModel.content)
                writerUid = dataModel.uid
            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FBRef.boardRef.child(key).addValueEventListener(postListener)
    }
}

android kotlin firebase

답변 1

0

개복치개발자

안녕하세요

 

수정 화면에서 이미지를 클릭했을 때 기존 WriteActivity에서 이미지를 추가했을 때와 같이 나오고

에러도 없이 실행이 되는데 이렇게 하는게 맞는건가 싶어서 질문드립니다!

와 같이 말씀해주셨는데 어떤 화면을 보고 계신지 스크린샷으로 좀 더 자세히 알려주시겠어요?

강의 어느부분을 보고 계신지도 알려주시면 좋을 것 같습니다!

0

monk

강의는 게시글 수정 만들기 - 2 였습니다.

스크린샷 2023-03-23 004359.png

게시글로 들어가서 수정 버튼을 눌렀을 때 이동되는 화면인 수정 페이지입니다.

강의대로 했을 때에는 제목이랑 글 내용만 수정이 되고 사진은 바꿀 수 없는 것 같아서 수정화면에서도 WriteActivity의 사진 넣는 기능을 그대로 옮겨왔습니다.

0

개복치개발자

네 이렇게 하셔도 무관합니다.

다만, 저 사진 수정 기능을 writeActivity / editActivity 2군데서 중복해서 코드를 짜다 보면

나중에 수정이 귀찮아지거나 관리가 힘들어질 수 있습니다.

좋은 방법으로는

EditUtil 이라는 class를 만들어서 여기에 uploadImg 라는 function을 만들어서 관리하는 것은 어떨까요?

 

이미지가 기본이미지인지 확인

0

132

1

NavController error 발생

0

141

1

fragment 생성하고 메인에서 불러왔는데 안뜹니다.

0

141

2

67강 댓글

0

100

2

7강 데이터바인딩 에러

0

116

2

Firebase 스토리지 유료화 문제

1

297

2

게시글 이미지가 파이어베이스에 저장되지 않습니다.

0

181

2

AVD 갤러리에 이미지 저장 안되는 문제

0

241

2

이미지 받아오는 방법?

0

204

2

회원탈퇴 기능을 추가하려고 합니다.

0

188

2

상태바 질문 드립니다.

0

111

1

섹션2 인트로 페이지 꾸미기 질문 드립니다.

0

110

1

게시판 글을 길게 쓸경우

0

124

2

로그인 로그아웃

0

177

2

갤럭시 연결시 게시판에 업로드한 사진이 보이지 않아요.

0

207

2

웹뷰 AVD 실행안됨

0

191

1

자막켜기가 안되요 ㅜ.ㅜ

1

186

1

리사이클러뷰, 그리드레이아웃 오류

0

186

2

리사이클러뷰 오류 해결 방법이 궁금합니다.

0

195

1

firebase 스마트폰으로 연결이 안되는데 원인이 있을까요

0

259

2

안드로이드 스튜디오 게시글 이미지 업로드 유무

0

217

1

firebase 설정 오류

0

304

2

홈 화면 커뮤니티

0

178

1

게시판 글 읽기

0

240

2