인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

monk님의 프로필 이미지
monk

작성한 질문수

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

게시글 수정 만들기 - 2

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

작성

·

463

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

답변 1

0

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요

 

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

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

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

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

monk님의 프로필 이미지
monk
질문자

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

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

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

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

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

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

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

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

좋은 방법으로는

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

 

monk님의 프로필 이미지
monk

작성한 질문수

질문하기