반응형
Kotlin Fragment 사용하기
우선 Activity 와 Fragment 의 차이는 lifecycle 을 봐도 알수가 있습니다.
Activity LifeCycle
Fragment 의 LifeCycle
요약하면,
Activity 는 무거움. Fragment 가벼움.
기능에 따라 다르겠지만,
예를들어 5개의 Activity로 만든 앱 보다는 1개의 Activity 와 5개의 Fragment로 만든 앱이 더 가볍고 (화면전환이) 빠릅니다.
Fragment 만들기
fragment package를 만들어서 fragment 를 관리합니다.
(프로젝트가 크다면, fragment 들을 기능별로 나누는게 좋습니다)
그리고 Empty Fragment 생성.
기본적으로 생성되는 코드는 아래와 같습니다.
파라메터 받는 예제가 있습니다.
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.bryan.selfdentlight.R
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [LightFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class LightFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_light, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment LightFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
LightFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
Layout 은
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.LightFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
Activity -> Fragment
val transaction = supportFragmentManager.beginTransaction();
transaction.replace(R.id.main_fragment_content, LightFragment())
transaction.addToBackStack(null)
transaction.commit()
R.id.main_fragment_content 는 activity_main.xml 에 있는 layout 의 id 입니다.
거기에 fragment 가 들어갑니다.
Fragment 종료하기
fragment.kt 의 onClick 어딘가에서
activity?.supportFragmentManager?.beginTransaction()?.remove(this)?.commit()
728x90
반응형
댓글