갤러리를 여는 것까지는 실행이 되는데 사진을 가져와 프로필이 변경되는게 안되서
이틀 넘게 헤맸다..!
하지만.. 결국 dialogfragment에서 다른 fragment로 데이터를 전달해줄때 이벤트 리스너를 만들어 이용하면 된다는 것을 알아냈고,, 이를 적용했더니 프로필 사진이 마침내!! 변경되었다
Interface????
2개 이상의 장치나 소프트웨어 사이에 정보나 신호를 주고 받을 수 있도록 해줌
BottomSheet 클래스에서는 onImageSelected 메서드를 호출하여 이미지가 선택되었을 때 이를 FrontProfileFragment에 알리게 된다.
이런식으로 FrontProfileFragment와 BottomSheet 사이에서 이미지 선택에 대한 상호작용이 이루어짐.
리스너????
"리스너"는 이벤트를 감지하고 처리하기 위한 인터페이스.
안드로이드 앱에서 사용자의 동작(터치, 클릭, 스와이프 등)이나 시스템의 변화(데이터 도착, 상태 변경 등)를 감지하고 그에 따른 작업을 수행하는 데 사용됨.
.
리스너는 특정 이벤트가 발생했을 때 어떤 동작을 취할지를 정의한 코드 블록.
리스너는 특정 인터페이스를 구현하며, 해당 인터페이스에 정의된 메서드를 구현하여 이벤트 핸들링 로직을 작성.
=>ex) 버튼 클릭 리스너// View.OnClickListener는 클릭 이벤트를 감지하고 처리하는 인터페이스 button.setOnClickListener(object : View.OnClickListener { override fun onClick(view: View) { // 버튼이 클릭되었을 때 수행할 동작 작성 Log.d("ButtonClick", "Button clicked!") } })
이벤트 리스너????
OnClickListener, OnItemSelectedListener와 마찬가지로 자작 Listener도 인터페이스로 선언을 한다. View의 이벤트를 전달 받을 Activity혹은 클래스는 해당 인터페이스를 구현하고 그 구현체를 View에 등록을 하게된다.
.
키보드나 마우스를 클릭하거나 마우스를 움직이는 등의 컴퓨터 내의 동작들을 이벤트가 발생했다고 하며, 해당 동작들을 어떻게 처리할지 결정하는 것을 이벤트 처리라고 한다. 해당 이벤트는 이벤트 리스너 객체를 생성하여 처리
프로필 이미지가 선택되었을 때의 이벤트를 처리하기 위한 메서드를 정의
인터페이스에는 추상 메서드인 onImageSelected가 선언. 이 메서드는 선택된 이미지의 Uri를 전달받음
//인터페이스명
interface OnImageSelectedListener {
//메서드 선언
fun onImageSelected(imageUri: Uri)
}
imageSelectedListener 변수는 OnImageSelectedListener 인터페이스의 구현체(리스너)를 저장
setOnImageSelectedListener 메서드는 외부에서 해당 리스너를 설정할 수 있도록 하는 메서드
//interface로 선언했던 이벤트 리스너를 변수로 등록
private var imageSelectedListener: OnImageSelectedListener? = null
//외부에서 이벤트 등록할 수 있도록 메서드 만들어줌
fun setOnImageSelectedListener(listener: OnImageSelectedListener) {
this.imageSelectedListener = listener
}
Fragment를 상속하면서 동시에 BottomSheet.OnImageSelectedListener 인터페이스를 구현
=>프래그먼트로서 동작하는 동시에, BottomSheet에서 정의한 이미지 선택 이벤트에 대한 리스너로 동작할 수 있음 의미
=>FrontProfileFragment가 OnImageSelectedListener 인터페이스의 메서드인 onImageSelected를 오버라이드하여 해당 메서드에서 원하는 동작을 정의할 수 있게됨
//Fragment 상속 + 인터페이스 구현
class FrontProfileFragment : Fragment(),BottomSheet.OnImageSelectedListener
BottomSheet에서 이미지가 선택되면 해당 이미지의 Uri를 onImageSelected 메서드를 통해 FrontProfileFragment에 전달
//프로필 사진 클릭이벤트
binding.profileIv.setOnClickListener {
//변수 선언
val bottomSheet = BottomSheet()
//프래그먼트에 이미지Uri전달
bottomSheet.setOnImageSelectedListener(this@FrontProfileFragment)
}
onImageSelected 메서드는 OnImageSelectedListener 인터페이스에 선언된 추상 메서드를 오버라이드
=>onImageSelected 메서드는 OnImageSelectedListener 인터페이스를 구현한 클래스에서 정의한 메서드.
이 메서드는 프로필 이미지가 선택되었을 때 어떻게 동작해야 하는지를 나타냄
//다이얼로그프래그먼트에서 생성한 ListenerInterface 구현
override fun onImageSelected(imageUri: Uri) {
//받은 데이터를 어떻게 활용할지에 대한 로직
//Glide를 사용한 이미지 로딩
Glide.with(requireContext()).load(imageUri).into(binding.profileIv)
}
![]() | ![]() |
---|