티스토리 뷰

728x90

 

 

Activity와 Fragment 간에 데이터를 전달하는 방법은 여러가지가 있겠지만, 

여기서는 리스너를 활용하는 방법을 작성하려고 한다.

프래그먼트에서 생성하거나 받아온 데이터를, 자신을 호출한 액티비티에서 처리해야 할 경우 사용할 수 있겠다.

 

 

1. ListenerInterface 생성하기

interface CustomDialogInterface {
    fun onAddButtonClicked(date: String, contents: String, posted: String)
}

리스너가 한개인 인터페이스를 생성했다.

내 경우에는 custom dialog가 fragment가 되고, add button을 클릭하면 액티비티에 데이터를 전송하는 방식이었기 때문에 인터페이스명/함수명을 이런 식으로 작성했다.

매개변수도 각자 필요한 데이터로 넣으면 된다.

 

 

2. Activity에서 ListenerInterface 구현하기

class MainActivity : CustomDialogInterface {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
    }

    override fun onAddButtonClicked(date: String, contents: String, posted: String) {
    	// 데이터 처리 로직 작성
    }
}

프래그먼트를 호출할 액티비티에서 방금 생성한 ListenerInterface를 구현한다.

onAddButtonClicked 안에는 프래그먼트에게 받은 데이터를 어떻게 처리할 것인지에 대한 로직을 작성하면 된다.

 

 

3. 프래그먼트에서 액티비티의 리스너 호출하기

class AddDialog(private val _context: Context, private val customDialogInterface: CustomDialogInterface) : DialogFragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        super.onCreateView(inflater, container, savedInstanceState)

        binding.addBtn.setOnClickListener {
            customDialogInterface.onAddButtonClicked(
                currentDate.toString(),
                contents,
                LocalDateTime.now().toString()
            )
        }
        
        return binding.root
    }
}

(필요한 부분만 보기 위해 다른 코드들은 다 삭제한 상태)

프래그먼트에서 어떠한 버튼을 누르면 액티비티의 리스너를 호출하도록 구현했다.

리스너의 인자로 필요한 데이터를 넣으면 액티비티가 그 데이터를 받아 처리한다.

 

이때, 리스너를 호출하기 위해서는 생성한 ListenerInterface의 객체, 즉 activity가 필요하다.

액티비티에서 프래그먼트의 객체를 생성할 때, 자신의 ListenerInterface 객체를 전달할 수 있도록 했다.

 

class AddDialog(private val _context: Context, private val customDialogInterface: CustomDialogInterface) : DialogFragment()

그러기 위해서는 프래그먼트의 생성자 매개변수에도 ListenerInterface가 있어야 하고,

	AddDialog(this, this).show(supportFragmentManager, "dialog")

액티비티에서 프래그먼트 객체를 생성할 때에도 ListenerInterface를 보내주어야 한다.

액티비티가 ListenerInterface를 구현했기 때문에 this 키워드로 전달하면 된다.

 

 

 

 

 

 

구현 방법을 정리하면 아래와 같다.

 

1. 리스너 인터페이스 생성

2. 액티비티에서 인터페이스 구현. 리스너에 데이터(매개변수)와 데이터 처리 로직을 포함해야 한다.

3. 액티비티에서 프래그먼트를 호출할 때 인터페이스를 전달(자기자신)

4. 프래그먼트에서 액티비티로 데이터를 전달하고자 할 때마다, 액티비티의 리스너를 호출

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함