마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 스튜디오 코틀린 토스트 메시지 출력 도와주세요

0 추천

해당 그림을 터치하면 그림의 제목을 토스트로 출력하고 싶은데요 

어떻게 해야할지 잘 모르겠어서 조언 좀 부탁드립니다 ㅜㅜ

 

그림마다 제목이 올바르게 들어가게 하고싶은데 토스트에서 텍스트를 어떻게 넣을지 감이 안잡히네요..

 

imageview.setOnTouchListener { v, event ->
    var ivDraw = findViewById<ImageView>(R.id.ivDraw)
    ivDraw.scaleType = ImageView.ScaleType.FIT_CENTER
    ivDraw.setImageResource(drawID[position])
    var toast = Toast(this@MainActivity)
    toastView = View.inflate(this@MainActivity,R.layout.toast1, null)
    toastText = toastView.findViewById<TextView>(R.id.drName)
    toast.view = toastView
    toast.show()

    false
}
안드스튜코틀린 (150 포인트) 님이 2020년 12월 1일 질문

1개의 답변

0 추천
 
채택된 답변

님이 원하시는 동작이 이미지 클릭에 반응하는 것이므로 setOnTouchListener 대신 setOnClickListener 를 사용하세요.

그리고 이미지를 클릭했을 때 해당 이미지에 대한 정보를 가지고 있어야 일치하는 정보를 뿌려줄 수 있겠죠. 그리고 이미지뷰 안에 해당 정보를 보관하지 마시고 별도의 데이터 구조에 저장하신 후 이 걸 이미지뷰에 맵핑해서 사용하는 것이 의존성을 줄이고 추후에 이미지가 아니라 버튼이나 텍스트뷰 같은 걸로 뷰가 바뀔 경우에 코드의 변경사항이 적어지므로 훨씬 유연한 코드가 된다고 할 수 있습니다.

data class ImageDetail(
    private val id: Int,
    private val title: String,
    private val description: String,
    @DrawableRes  private val source: Int
)


// Activity
private val imageDetails = arrayListOf<ImageDetail>();

override fun onCreate(...) {
    super.onCreate(...)
    
    loadAndUpdateImages()
}

private fun loadAndUpdateImages() {
    loadImageData()
    updateImages()
}

private void loadImageData() {
    imageDetails.clear();
    imageDetails.add(ImageDetail(id = R.id.ivDraw, title = "Title1", description = "Description1", source = R.drawable.drawableId1));
    // 필요한 ImageDetail을 추가;
}

private val imageIds = hashMapOf<Int, ImageView>()

private fun updateImages() {
    imageDetails.forEach { imageDetail ->
        imageIds[imageDetails.id] ?: findViewId<ImageView>(imageDetails.id).also { view -> 
              imageIds[imageDetails.id] = view
              view.setImageResources(imageDetail.source);
              view.setOnClickListener {
                    showToastMessage(imageDetail)
              }
        }
        
    }
}

private val toastView by lazy { View.inflate(this@MainActivity,R.layout.toast1, null) }
private val toastText by lazy { toastView.findViewById<TextView>(R.id.drName) }

private fun showToastMessage(imageDetail: ImageDetail) {
    Toast(this@MainActivity).also { toast ->
       toastText.setText(imageDetail.title)
       toast.view = toastView
       toast.show()
    }
}

 

spark (224,800 포인트) 님이 2020년 12월 1일 답변
spark님이 2020년 12월 1일 수정
헉..감사합니다 제가 자바를 할 줄 몰라서 혹시 코틀린으로 작성하면 어떻게 해야하는건지 알려주실수 있으신가요?
제가 작성한 코드가 코틀린코드인데요. 올리신 예제가 코틀린으로 되어있길래 저도 코틀린으로 작성했어요.
...