티스토리 뷰

반응형

액티비티에서 프래그먼트로, 또는 그 반대로 데이터를 주고 받을 수 있습니다.

 

액티비티에서 프래그먼트로 데이터를 전달할 때는 argument와 bundle을 이용합니다.

프래그먼트에서 액티비티로 데이터를 전달할 때는 리스너를 직접 구현해서 데이터 전달이 가능합니다.

 

1. 액티비티 -> 프래그먼트로 데이터 전달하기

 

우선 다음의 액티비티 XML 코드를 확인합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".FragmentActivity">

    <fragment
        android:id="@+id/fragment_one"
        android:name="com.example.myapplication.FragmentOne"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>


</LinearLayout>

액티비티 코틀린 파일을 확인합니다. 액티비티 생명주기에서 onCreate 부분에서 arguments와 bundle을 사용해서 데이터 값을 넣어주게 됩니다. bundle의 put 메소드를 이용해 원하는 데이터를 넣은 후, 프래그먼트의 arguments에 데이터가 들어간 bundle을 할당합니다.

반응형
class FragmentActivity : AppCompatActivity() {
   
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_fragment)

        val bundle: Bundle = Bundle()
        bundle.putString("hello", "hello")
        fragmentOne.arguments = bundle

}

프래그먼트 코틀린 파일을 확인합니다. 프래그먼트 생명주기에서 onActivityCreated 부분에서 argument의 get 메소드를 통해서 데이터를 불러내면 됩니다.

class FragmentOne:Fragment (){

    override fun onActivityCreated(savedInstanceState: Bundle?) {

        val data = arguments?.getString("hello")
        Log.d("data", data)

        super.onActivityCreated(savedInstanceState)
    }

 
}

 

2. 프래그먼트 -> 액티비티로 데이터 전달하기

 

프래그먼트에서 액티비티로 데이터를 전달하려면, 리스너를 직접 만들어서 전달해야 합니다.

 

우선 전달하려는 레이아웃에 ID값을 지정합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#E91E63"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/pass"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="전달"/>

</LinearLayout>

 

프래그먼트 부분의 코드를 확인합니다.

class FragmentOne:Fragment (){

	//리스너 만드는 부분
    interface  OnDataPassListener {
        fun onDataPass(data: String?) 
    }
    
    lateinit var dataPassListener: OnDataPassListener

    override fun onAttach(context: Context) {

        super.onAttach(context)
        
        dataPassListener = context as OnDataPassListener
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    
        super.onViewCreated(view, savedInstanceState)
        
        pass.setOnClickListener {
            dataPassListener.onDataPass("데이터 이동")
        }
    }

}

우선 리스너를 만드는 부분을 봅니다. 리스너는 인터페이스로 구현합니다. 데이터를 넘겨주기 위한 onDatatPass 메소드는 나중에 액티비티 측에서 구현합니다.

 

lateinit var dataPassListener: OnDataPassListener 부분을 보면, lateinit은 초기화를 늦춰주는 역할을 합니다. OnDataPassListener 타입의 dataPassListener 변수를 선언해줍니다.

 

제일 먼저 시작되는 프래그먼트의 onAttach 부분에서 dataPassListener 변수에 context를 할당합니다. 이때 context는 OnDataPassListener 타입으로 캐스팅되도록 as 연산자를 사용하였습니다.

 

전달 버튼을 클릭하면 데이터가 전달될 수 있도록, pass로부터 setOnClickListener 리스너를 가져옵니다. dataPassListener의 onDataPass 부분에 전달할 데이터를 넣어줍니다.

 

다음은 액티비티 파일을 확인해 봅시다.

class FragmentActivity : AppCompatActivity(), FragmentOne.OnDataPassListener {
    override fun onDataPass(data: String?) {
        Log.d("pass", ""+ data)
    }
    
 }

FragmentActivity 클래스에서 우선 onDataPassListener 인터페이스를 상속받아야 합니다. 인터페이스를 상속 받을 때는 AppCompatActivity( )와 달리 메소드를 의미하는 소괄호 ( )가 들어가지 않음을 상기시켜주시기 바랍니다.

 

인터페이스를 받았으니, 인터페이스 함수를 구현해야 합니다. Generate - Implement 를 통해서 메소드를 구현합니다.

실제 Logcat에 찍어보면 데이터가 전달된 것을 확인할 수 있습니다.

 

 

반응형

'Android App Coding' 카테고리의 다른 글

컨텍스트 Context  (0) 2021.07.09
리소스 값 Resource Values  (0) 2021.07.09
프래그먼트 매니저와 트랜잭션 FragmentManager/Transaction  (0) 2021.07.08
프래그먼트 Fragment  (0) 2021.07.08
작업 관리(태스크) Task  (0) 2021.07.08
댓글