본문 바로가기
Android

[Kotlin] Fragment 에서 상위 Activity Method 호출하기

by bryan.oh 2023. 7. 28.
반응형

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
반응형

댓글