<fragment
android:id="@+id/fragment1"
android:name="com.example.myapplication.Fragment1"
android:layout_width="match_parent"
android:layout_height="300dp"
/>
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// fragment1을 container에 그려넣는다.
return inflater.inflate(R.layout.fragment1, container, false)
}
버튼을 누르면 fragment가 activity에 담기도록 하는 예제
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/black"
android:orientation="vertical"/>
// fragment를 동적으로 작동하는 방법
// 1. fragment를 만든다
val fragment1 : Fragment1 = Fragment1()
val button: Button = findViewById(R.id.button)
button.setOnClickListener {
val fragmentManager : FragmentManager = supportFragmentManager
// Transaction
// 작업의 단위 -> 시작과 끝이 있다
val fragmentTransaction = fragmentManager.beginTransaction() // 트랜잭션을 시작하겠다.
fragmentTransaction.replace(R.id.container, fragment1)
fragmentTransaction.commit() // 트랜잭션을 끝낸다.
}
val button2: Button = findViewById(R.id.button2)
button2.setOnClickListener {
val fragmentManager : FragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.detach(fragment1)
// 혹은 fragmentTransaction.remove(fragment1)
fragmentTransaction.commit()
}
val fragment1 : Fragment1 = Fragment1()
// fragment에 data를 넣어주는 방법
// 1. bundle 객체를 만들어 정보를 넣는다.
val bundle : Bundle = Bundle()
bundle.putString("Hello", "hello")
// 2. 앞서 만든 bundle 객체를 fragment에 끼워넣는다.
fragment1.arguments = bundle
override fun onActivityCreated(savedInstanceState: Bundle?) {
// argument들을 꺼내옴
val data = arguments?.getString("Hello")
if (data != null) {
Log.d("data", data)
}
super.onActivityCreated(savedInstanceState)
}
fragment에 정보가 전달되는 시점은 Transaction의 commit()이 수행되는 시점이다.
-> 따라서 정적으로 xml에 viewComponent로 추가한 경우에 data는 null값이다.
package com.example.myapplication
import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentManager
class FragmentActivity : AppCompatActivity(), Fragment1.OndataPassListener {
// 5. 리스너 (듣는 부분)
override fun onDataPass(data: String?) {
// fragment에서 data가 오면 Activity에서 처리해줘야하는 코드
Log.d("pass",""+data)
}
...
}
package com.example.myapplication
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.fragment.app.Fragment
class Fragment1 : Fragment(){
// 1. 리스너 만들기
interface OndataPassListener {
fun onDataPass(data:String?)
}
// 2. 리스너 타입 변수 만들기
lateinit var dataPassListener: OndataPassListener
override fun onAttach(context: Context) {
Log.d("life_cycle", "F onAttach")
super.onAttach(context)
// 3. context를 형변환해줌
// Activity는 OndataPassListener를 implement한 것이라
// context를 OndataPassListemenr로 형변환해서 사용 가능
dataPassListener = context as OndataPassListener
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Log.d("life_cycle", "F onViewCreated")
super.onViewCreated(view, savedInstanceState)
// 4. 리스너에게 데이터를 넣어주는 역할을 하는 부분, onDataPass가 울리게 만듦
val pass : Button = view.findViewById(R.id.pass)
pass.setOnClickListener {
dataPassListener.onDataPass("Good Bye")
}
}
...
}