반응형
Fragment 에서 상위 Activity Method 호출하기
이전 글에 이어서 작성하는 것이라서
혹시 따라하기를 원하신다면 이전 포스트를 먼저 보시고 오시면 됩니다~
아래 이미지는 현재 테스트 하려는 Activity 와 Fragment 구조입니다.
fragment 에서 자신을 포함하고 있는 Activity 의 method 를 호출할 수 있습니다.
우선 상위 Activity 에 method 를 만들겠습니다.
fun someMethodInActivity(num: Int){
Log.d("someMethodInActivity", "parameter : $num")
}
그리고 위에서 작성한 Fragment 에서 login 버튼을 클릭했을 때, 이 메소드를 호출합니다.
버튼에 id 속성을 확인하고, (없다면 입력)
fragment_login.xml 의 버튼
<Button
android:id="@+id/login_button"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="Button" />
viewBinding을 했으니 setOnClickListener 로 상위 Activity method 를 호출합니다.
fragment 의 전체 소스입니다.
LoginFragment.kt
class LoginFragment : Fragment() {
private lateinit var binding: FragmentLoginBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentLoginBinding.inflate(inflater, container, false)
binding.loginButton.setOnClickListener {
// 상위 activity 의 method 호출
val activity = activity as FragmentTestActivity?
activity?.someMethodInActivity(0)
}
return binding.root
}
}
그리고 시뮬레이터를 실행하고, login Button 을 눌러보고, 로그를 확인해 보면
클릭한만큼 로그가 찍힙니다.
중요한 부분은 여기 입니다.
// 상위 activity 의 method 호출
val activity = activity as FragmentTestActivity?
activity?.someMethodInActivity(0)
만약에 여러 Activity 에서 LoginFragment 를 사용하고 있다면, 이부분은 어떻게 될까요?
val activity = activity as MainActivity?
이렇게 MainActivty를 변경하고 MainActiviry에도 someMethodInActivity(int) 함수를 만들고 실행해보면
다음과 같은 오류가 발생합니다.
com.example.test01.FragmentTestActivity cannot be cast to com.example.test01.MainActivity
if(activity is MainActivity) {
val activity = activity as MainActivity?
activity?.someMethodInActivity(0)
}
이렇게 type check 를 하거나,
모든 상위 activity 처리를 한다면, when 문을 사용해서 처리할 수 도 있습니다.
물론 많은 방법이 있습니다만, 그 중 한가지 방법이라고 보시면 됩니다.
binding.loginButton.setOnClickListener {
// 상위 activity 의 method 호출
when(activity) {
is MainActivity -> {
val activity = activity as MainActivity?
activity?.someMethodInActivity(0)
}
is FragmentTestActivity -> {
val activity = activity as FragmentTestActivity?
activity?.someMethodInActivity(0)
}
}
}
Fragment 의 버튼 클릭으로
Activity 에서 Fragment 변경하기
를 작성해보겠습니다.
728x90
반응형
'Android' 카테고리의 다른 글
[Kotlin] FrameLayout 사용해서 Fragment 써보기 (0) | 2023.07.28 |
---|---|
[Kotlin] Activity 에서 Fragment 변경하기 (0) | 2023.07.28 |
[Kotlin] Fragment 사용하기 (0) | 2023.07.28 |
[Kotlin] Android 에서 Retrofit2 사용하여 API 호출하기 (0) | 2023.07.25 |
[Kotlin] apply, with, let, ?: 사용하기 (0) | 2023.07.25 |
댓글