프래그먼트를 사용하면 프래그먼트간, 또는 액티비티-프래그먼트간의 데이터 전달이 필요할 때가 생긴다.
액티비티간의 데이터 전달은 Extra를 이용해 인텐트로 값을 넘기면 되었지만
프래그먼트는 인텐트를 사용하지 않고, Bundle을 이용해 데이터를 주고 받는다.
오늘은 받는쪽 프래그먼트의 과정을 중점적으로 글을 정리해보려고 한다.
프래그먼트파일을 새성하면 아래와 같이 자동적으로 기본적인 코드가 작성되어있는데,
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
class BlankFragment : Fragment() {
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_blank, container, false)
}
companion object {
@JvmStatic
fun newInstance(param1: String, param2: String) =
BlankFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
우리가 데이터를 받아오기 위해 가장먼저 확인해야 할 부분은
private const val ARG_PARAM1 = "param1"
private var param1: String? = null
이 부분이다.
받아올 param과 param의 타입이 먼저 정해져야 한다.
이 param은 받는 param이다.
그 다음 우리가 봐야할 부분은 제일 아래이다.
companion object {
@JvmStatic
fun newInstance(param1: String, param2: String) =
BlankFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
보내는 프래그먼트에서 데이터를 보낼때 "보낼프래그먼트.newInstance(데이터)"의 형태로 보내게 된다.
데이터는 문자열이라는 가정이다.
그렇게 되면 위의 코드 newInstance함수에 param값으로 데이터가 인자로 받아지고, putString으로 param값이 Bundle에 담아둔다.
여기서 param은 보낼 프래그먼트의 데이터 이다.
위에서 선언해준 param과 newInstance함수 인자의 param이 같다고 헷갈리면 안된다.
(내가 그거에 헷갈려서 이해하는데 한참이 걸렸기 때문에....;;)
담아둔 Bundle은 arguments에 대입되고,
arguments는 onCreate함수에서 코드 상단에서 선언한 param으로 Bundle에서 빼오게 된다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
이렇게 되면 보낼프래그먼트에서 데이터를 보내고 받는프래그먼트에서 데이트를 받는 과정이 끝나게 된다.
위의 내용을 잘 이해했다면 데이터의 타입문제도 잘 해결했을거라 생각한다.
혹시 모르겠다면 글이 길어진 관계로 다음글에서 이어서 작성해보겠다.