Fragment 사용하기
activity와 fragment의 관계에 대해서는 아래의 포스팅에 자세히 설명해두었다.
2021.01.14 - [💻프론트엔드/android studio] - Activity와 Fragment
Activity와 Fragment
안드로이드 스튜디오 관련 영상을 보던 중 Activity가 아닌 Fragment를 만들었다는 설명이 있어 둘의 차이가 궁금해 찾아보았다. 우선 간단히 말하자면 Fragment는 Activity와 View를 합쳐놓은 것으로 Activi
ye333.tistory.com
fragment를 사용하는 방법에는 두가지가 있다.
1. XML에 ViewComponent로 추가한다.
2. 코드를 통해 동적으로 추가한다.
fragment 추가하기
1. XML에 ViewComponent로 추가하기
fragment를 상속받는 activity를 만든다.
XML 파일에 fragment VIewComponent를 추가한다.
fragment를 ViewComponent로 사용할 때
어떤 fragment를 사용할지 꼭 name을 선언해주어야 하고 반드시 id를 지정해주어야 한다.
<fragment
android:id="@+id/fragment_test"
android:name="com.example.prac_android.TestFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
activity life cycle에서는 뷰를 그릴 때 onCreate()가 호출되듯이,
fragment life cycle에서는 뷰를 처음으로 그릴 때 onCreateView()가 호출된다.
이때 onCreate()에서 들어오는 saveInstaceState 외에도 inflater, container가 들어온다.
inflater : 뷰를 그려주는 역할
container : 부모 뷰
//activity 에서 화면에 뷰 출력
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_fragment)
}
//fragment 에서 화면에 뷰 출력
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_test, container, false)
}
2.코드로 추가하기
아래의 LinearLayout 자리에 fragment를 동적으로 삽입하는 방법에 대해 알아본다.
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" />
동적으로 삽입할 때는 activity에서 작업한다.
1. fragment를 만든다.
2. fragmentmanager를 만든다.
3. transaction을 만들어 beginTransaction()한다.
4. replace에 대상을 적어 뷰를 fragment로 바꾼다.
5. commit으로 끝낸다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_fragment)
val fragmentTest : TestFragment = TestFragment()
val fragmentManager : FragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.container, fragmentTest)
fragmentTransaction.commit()
}
transaction은 작업의 단위로 시작과 끝을 명시해주어야 한다.
끝을 내는 방법에는 commit과 commitnow가 있는데
1. commit은 시간 될 때 끝내라
2. commitnow는 지금 당장 끝내라는 뜻이다.
보통 commit을 쓰는게 좀 더 안정적이다.
fragment 없애기
transaction을 이용해 fragment를 붙일 때 replace를 사용했듯이
없앨 때는 detach 또는 remove를 사용하면 된다.
이때, 주의할 점은 fragment를 새로 선언한 후 detach 또는 remove를 적용하는게 아니라
replace에서 선언한 fragment에 detach 또는 remove를 적용해야 한다.
detach와 remove의 차이는
1. detach는 없앤 후 다시 붙일 수 없고
2. remove는 없앤 후 다시 붙일 수 있다는 점이다.
val fragmentManager : FragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.detach(fragmentTest)
fragmentTransaction.commit()
fragment 데이터 주고받기
데이터를 주고받는 방법에는
activity에서 fragment로 전달하는 방법과
fragment에서 activity로 전달하는 방법이 있다.
1. activty에서 fragment로 전달하는 방법은 bundle과 argument를 사용하고
2. fragment에서 activirty로 전달하는 방법은 리스너 구현을 통해 자체 구현하는 방법이다.
1-1. activity -> fragment 데이터 전달하기
activity에서 activity로 데이터를 전달할 때 intent.putExtra를 사용하였다.
fragment에 데이터를 전달할 때는 Bundle을 만들어
arguments를 이용해 Bundle을 fragment에 넣어줘야한다.
이때 bundle은 타입을 지정해주어야한다.
val fragmentTest : TestFragment = TestFragment()
val bundle : Bundle = Bundle()
bundle.putString("hello", "hello")
fragmentTest.arguments = bundle
1-2. activity -> fragment 데이터 받기
fragment의 onActivityCreated()에서 argument를 꺼내준다.
override fun onActivityCreated(savedInstanceState: Bundle?) {
val data = arguments?.getString("hello")
super.onActivityCreated(savedInstanceState)
}
2-1 fragment -> activity 데이터 전달하기
fragment에서 작업한다.
1. onDataPass가 있는 OnDataPassListener 인터페이스를 생성한다.
2. dataPassListener를 선언한다.
3. onAttach의 인자 context를 OnDataPassListener에 캐스팅하여 dataPassListener에 저장한다.
4. onViewCreated에서 onDataPass 함수가 작동하도록 작성한다.
activity에서 리스너 등 대부분의 작업을 onCreate()에 작성하듯
fragment에서는 대부분의 작업을 onViewCreated()에 작성한다.
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)
dataPassListener.onDataPass("Good Bye")
}
2-1 fragment -> activity 데이터 받기
activity에서 작업한다.
1. activity에 TestFragment의 OnDataPassListener를 인터페이스화한다.
1. OnDataPassListener의 onDataPass를 override한다.
class FragmentActivity : AppCompatActivity(), TestFragment.OnDataPassListener {
override fun onDataPass(data: String?) {
TODO("Not yet implemented")
}
}
'💻개발 > Android' 카테고리의 다른 글
리스트뷰 그리는 방법1 : addView (0) | 2021.05.28 |
---|---|
Framework 와 Library (0) | 2021.05.28 |
Intent (0) | 2021.05.27 |
뷰바인딩 (viewbinding) (0) | 2021.05.27 |
activity 수명 주기 (0) | 2021.05.26 |