<Android>setHasOptionsMenu() deprecated 되어서 addMenuProvider 사용하기 - fragment

진섭·2023년 7월 1일
1

Android

목록 보기
26/31
post-thumbnail

🔨 개요

fragment에서 menu를 연결하던 과정에서 setHasOptionsMenu(true) 이 부분이 deprecated 가 되어서 함수를 타고 들어가니 deprecated 되었으니 MenuProvider를 사용하라고 적혀있어 공식문서에 적혀있는대로 만드는 과정을 기록하겠습니다.

🔨 사용법

🔨 변경전

        setHasOptionsMenu(true)

        return fragmentListBinding.root

    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
       inflater.inflate(R.menu.list_fragment_menu,menu)
    }
    
}

🔨 변경후

  • requireActivity()는 현재 Fragment가 속한 Activity를 반환하는 메서드입니다.
  • MenuHost는 requireActivity()가 반환하는 Activity 객체를 저장할 수 있는 타입입니다.
  • requireActivity()가 반환하는 Activity를 menuHost 변수에 할당하여 Activity에 대한 참조를 유지합니다.
  • menuHost가 addMenuProvider() 메서드를 호출하여 익명 객체로 구현을 하고 implement 해주면 onCreateMenu(), onMenuItemSelected() 메서드를 구현해줍니다. 이름에도 나와있듯이 메뉴를 초기화하고 생성하는 메서드와 메뉴 항목을 선택되었을때 호출되는 메서드입니다.
  • , viewLifecycleOwner, Lifecycle.State.RESUMED 이 부분은 Lifecycle을 관리하는 코드 입니다.
class ListFragment : Fragment() {

	lateinit var fragmentListBinding: FragmentListBinding
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

        fragmentListBinding = FragmentListBinding.inflate(layoutInflater)
        val menuHost: MenuHost = requireActivity()
        
        menuHost.addMenuProvider(object : MenuProvider {
            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
                menuInflater.inflate(R.menu.list_fragment_menu, menu)
            }

            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
                return true
            }
        }, viewLifecycleOwner, Lifecycle.State.RESUMED)

        return fragmentListBinding.root
    }
}
        

참고문서 : https://developer.android.com/jetpack/androidx/releases/activity#1.4.0-alpha01

profile
Android 개발자

0개의 댓글