작성
·
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에서 이미지를 추가했을 때와 같이 나오고
에러도 없이 실행이 되는데 이렇게 하는게 맞는건가 싶어서 질문드립니다!
와 같이 말씀해주셨는데 어떤 화면을 보고 계신지 스크린샷으로 좀 더 자세히 알려주시겠어요?
강의 어느부분을 보고 계신지도 알려주시면 좋을 것 같습니다!
네 이렇게 하셔도 무관합니다.
다만, 저 사진 수정 기능을 writeActivity / editActivity 2군데서 중복해서 코드를 짜다 보면
나중에 수정이 귀찮아지거나 관리가 힘들어질 수 있습니다.
좋은 방법으로는
EditUtil 이라는 class를 만들어서 여기에 uploadImg 라는 function을 만들어서 관리하는 것은 어떨까요?
강의는 게시글 수정 만들기 - 2 였습니다.
게시글로 들어가서 수정 버튼을 눌렀을 때 이동되는 화면인 수정 페이지입니다.
강의대로 했을 때에는 제목이랑 글 내용만 수정이 되고 사진은 바꿀 수 없는 것 같아서 수정화면에서도 WriteActivity의 사진 넣는 기능을 그대로 옮겨왔습니다.