ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ANDROID] Navigation Back Pressed
    ANDROID/NAVIGATION COMPONENT 2021. 11. 21. 17:38

    onBackPressedDispatcher

     

    맞춤 뒤로 탐색 기능 제공  |  Android 개발자  |  Android Developers

    맞춤 뒤로 탐색 기능 제공 뒤로 탐색 기능은 사용자가 이전에 방문한 화면 기록을 통해 뒤로 이동하는 기능입니다. 모든 Android 기기는 이 유형의 탐색을 위해 뒤로 버튼을 제공하므로 앱 UI에 뒤

    developer.android.com

    Fragment자체는 BackPressed 메소드를 지원하지 않기 때문에 프레그먼트에서 뒤로가기를 사용하려면 BackPressedDispatcher를 사용해야합니다.

     

    Fragment가 열려있는 채로 뒤로가기를 누른다면 Activity에 Callback을 보내 BackPressed 요청을 처리합니다.

     

     

    BaseActivity 내부의 onBackPressed 메소드입니다.

        override fun onBackPressed() {
            // 액티비티 내의 프레그먼트에서 BackPressedCallback 이 넘어온다면, Callback 요청만 수행합니다.
            if(onBackPressedDispatcher.hasEnabledCallbacks()){
                onBackPressedDispatcher.onBackPressed()
                return
            }
    
            // Callback 요청이 아니고 navController 에 BackStack 이 쌓여있지 않다면  액티비티를 종료합니다.
            if(_navController?.popBackStack() == false) {
                finish()
                return
            }
    
            super.onBackPressed()
        }

     

    이제는 Fragment에서 Callback을 요청할 수 있게 해야됩니다.

    abstract class BaseFragment<>(
    
    ) : Fragment() {
    
    // Callback 객체를 만들어 줍니다.
        private val backPressedCallback = object : OnBackPressedCallback(false) {
            override fun handleOnBackPressed() {
    // 리스너
                onBackPressed()
            }
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    // Callback 객체를 상위 액티비트의 디스패쳐에 등록
            requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backPressedCallback)
        }
    
    // navController에 백스택이 있다면 뒤로가기.
        open fun onBackPressed() {
            navController.popBackStack()
        }
    }

     

    OnBackPressedCallback의 Constructor는 초기 사용 설정 상태를 나타내는 Boolean 값을 사용합니다. 콜백이 사용 설정된 때만(즉, isEnabled() true를 반환) 디스패처가 콜백의 handleOnBackPressed()를 호출하여 뒤로 버튼 이벤트를 처리합니다.

Designed by Tistory.