불로구

안드로이드 스튜디오 - Activity 와 Fragment간 데이터 주고 받기 본문

프로그래밍/코틀린 안드로이드

안드로이드 스튜디오 - Activity 와 Fragment간 데이터 주고 받기

맹이맹이 2021. 4. 21. 11:08
반응형
Activity -> Fragment

액티비티에서 프래그먼트로 데이터를 전송하기 위해선 Bundle이란 클래스를 사용한다.

 

Bundle이란?

-> 여러가지 타입의 값을 저장하는 Map 클래스

 

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val fragmentOne : FragmentOne = FragmentOne()
        val bundle : Bundle = Bundle()
        bundle.putString("hello","hello")
        fragmentOne.arguments = bundle
    }

-> 프래그먼트의 arguments를 통해 생성된 bundle을 할당한다

    override fun onActivityCreated(savedInstanceState: Bundle?) {

        val data = arguments?.getString("hello")
        Log.d("data" , "$data")
        super.onActivityCreated(savedInstanceState)
    }

-> onActivityCreated 메서드에서 arguments를 받아서 사용

 

Fragment -> Activity

프래그먼트에서 액티비티로 데이터를 전달하기 위해서는 사용자가 직접 리스너를 구현하면 된다.

 

    interface onDataPassListener {
        fun onDataPass(data : String?)
    }
    lateinit var dataPassListener : onDataPassListener

-> 우선 해당 프래그먼트.kt 파일에 인터페이스 리스너를 하나 생성한다.

-> 리스너 타입의 변수 하나를 lateinit를 통해 나중에 초기화

    override fun onAttach(context: Context) {
        super.onAttach(context)
        dataPassListener = context as onDataPassListener //형변환
    }

-> onAttach()메서드에 context를 리스너 타입으로 형변환

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val pass : Button by lazy { view.findViewById(R.id.pass) }

        // Activity의 OnCreate에서 했던 작업을 프래그먼트는 여기에서 수행행
       pass.setOnClickListener {
            dataPassListener.onDataPass("goodBye")
        }
    }

-> onViewCreated() 메서드에서 리스너에 데이터를 할당

class MainActivity : AppCompatActivity() , FragmentOne.onDataPassListener {

-> 액티비티는 해당 프래그먼트의 리스너를 상속받아 구현한다.

    override fun onDataPass(data: String?) {
        Log.d("pass", ""+data)
    }

 

반응형
Comments