본문 바로가기

개발일기

8월 한달 토이 프로젝트를 해보자! -06 : AppBar

이제 툴바를 추가해줄 차례다. ListFragmentDetailFragment가 사용할 툴바의 기능 및 아이콘 갯수가 다른 만큼, 액티비티에 기본적으로 배치를 하되 각 Fragment에 진입할 때 메뉴의 수정이 필요할 것이다.

우선 resource에 menu를 추가해준다. (리소스 추가하는 방식과 동일하게, menu로 만들겠다고 선택하면 디렉토리는 알아서 설정해준다.)

리스트 메뉴와 디테일 메뉴를 각각 만들었다.

list_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/list_settings"
        android:icon="@drawable/ic_settings"
        android:title="설정"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/list_more"
        android:icon="@drawable/ic_baseline_more_vert"
        android:title="더보기"
        app:showAsAction="ifRoom|withText"/>
</menu>

공식문서에서 setHasOptionsMenu(true)를 설정해주래서 해줬더니 Deprecated 되었다고 뜬다! 아니 공식아!!!

검색을 해보니, 2021.9월에 배포된 Jetpack Version 1.4.0-alpha01에 해당 언급이 있다. 링크는 아래에.

https://developer.android.com/jetpack/androidx/releases/activity#1.4.0-alpha01

addMenuProvider()를 사용하라는 것이다. 생명주기를 알고 있다고 하는 듯하다. 하라는대로 일단 ListFragment에 적용해보기로 했다.

메뉴야 항상 보이겠지만, 일단 RESUME 상태일 때를 나중에 핸들링할 경우가 있을 때 이런 방식도 있다, 하고 기록해두기 위하여 옵셔널하게 적용하였다.

ListFragment.kt

override fun onCreateView(...) {
    ...
    (requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {
        override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
            menuInflater.inflate(R.menu.list_menu, menu)
        }

        override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
            when(menuItem.itemId) {
                R.id.list_settings -> {

                }
                R.id.list_more -> {

                }
            }
            return true
        }
    }, viewLifecycleOwner, Lifecycle.State.RESUMED)
}