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

Fragment에서 Activity로 데이터를 전송하는 작업 중에 인터페이스 부분 질문드립니다.

0 추천

Fragment에서 Activity로 데이터를 전송하기 위해 developers를 참고하여

 

Fragment에 콜백 인터페이스를 정의하고

호스트 Activity에서 이를 구현하는 방식을 진행했습니다.

 

제가 이해하기 힘든 부분은 어떻게 activity에서 메서드를 구현했을 뿐인데  Fragment의 데이터가

전달될 수가 있는지 입니다.

 

예를들어 아래처럼 button에 클릭리스너를 연결하는 부분은

button.setOnclickListener { onclick 구현 } 

button에 onClickListenr를 implementation한 익명객체를 생성하여 전달하는것이고

 

버튼에 클릭 이벤트가 발생했을 경우 os가 해당 객체내 구현한 onClick()을 호출한다.

라고 어느정도 이해가 갑니다.(맞나요?....)

 

그런데

프래그먼트의 버튼과 액티비티에 구현한 메소드

뭔가 직관적으로 이해가 가지 않습니다..

 

Uretan (220 포인트) 님이 2021년 5월 28일 질문

1개의 답변

+1 추천
 
채택된 답변

코드를 이미지로 올리셔서 Copy & Paste 를 할 수가 없네요. 

MainActivity를 보시면 BlankFragment.OnDataPassListener를 구현하고 있습니다.

이걸  BlankFragment의 onAttch 이벤트를 보시면 넘어 온 conext를 OnDataPassListener로 타입캐스팅하고 있습니다. context 디버거로 확인해 보시면 MainActivity가 넘어올 겁니다. MainActivity는 BlankFragment.OnDataPassListener구현하고 있으므로 conext as BlankFragment.OnDataPassListener 할 수가 있습니다. 이걸로 BlankFragment는 이제 BlankFragment.OnDataPassListener를 통해 MainActivity와 커뮤니케이션이 가능하게 됩니다.

 

MainActivity에서 BlankFragment를 초기화하실 때 savedInstance 가 널일 경우에만 BlankFragment 를 초기화 해주셔야 해요. 만약 디바이스가 로테이트 되거나 하게 되면 이미 있던 BlankFragment를 다시 복구해주기때문에 BlnakFragment를 두개 가지게 되는 원치않은 증상이 생기데 됩니다.

override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)

     if (savedInstanceState == null) {
          supportFragmentManager
                .beginTransaction()
                .add(R.id.fl_main, BlankFragment())
                .commit()         
     } 
}

 

spark (226,420 포인트) 님이 2021년 5월 28일 답변
Uretan님이 2021년 5월 29일 채택됨
context가 MainActivity 를 참조하고 있었군요..
알기쉽게 알려주셔서 감사합니다 ㅜㅜ
밑에 savedInstance 부분도 전혀 생각지도 못했던 부분인데
Activity 라이프사이클도 고려하면서 작성해야겠습니다.
답변 정말 감사합니다!
...