본문 바로가기

개발일기

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

이제 ... 을 눌렀을 때 하위 메뉴가 나타나도록 설정해주면 되겠다. FragmentList에서 우선 SubMenu를 만들어줄 것이다.

list_sub_menu.xml 이라는 menuItems를 만들어준 다음, FragmentList에 다음과 같이 inflate 해줄 것이다. Fragment에 PopupMenu.OnMenuItemClickListener를 상속해두어 활용해주자.

FragmentList.kt

private fun showPopUp(v: View) {
    PopupMenu(requireActivity(), v, Gravity.RIGHT)
        .apply {
            setOnMenuItemClickListener(this@ListFragment)
            inflate(R.menu.list_submenu)
            show()
        }
}

...

override fun onMenuItemClick(item: MenuItem?): Boolean {
    return when(item?.itemId) {
        R.id.list_sub_write -> {

            true
        }
        R.id.list_sub_logout -> {

            true
        }
        else -> false
    }
}

list_more의 리스너에 위의 showPopUp을 추가해준 다음 테스트 해보면, 리스트가 뜸을 볼 수 있다.

그런데, 왜 한 번에 하나만 떠서 스크롤을 해야 할까??? 왜지??

  • 그런데 뭐여. DetailFragment 들어갔다가 돌아오니까 메뉴가 저렇게 되어있었다. 클릭 리스너도 안 먹힌다. 무슨 일이지?

왔다갔다 반복할수록 ... 개수가 늘어난다!!! 메뉴가 점점 쌓이고 있는 것이다!

아 이게 컨텍스트가 requireActivity()여서 그런가? 흠... 맞는 것 같은데?

1, requireActivity().invalidateOptionsMenu() onCreateView에서 안 먹힘.
2. requireActivity().invalidateMenu() onCreateView에서 안 먹힘.
3. 오예 성공!! 아래 서술하겠다.

해결한 방법 (드러운 것 같음)

드럽다... 생각은 들지만, 일단은 이게 성공했으니 기록해둔다. 각 Fragment에 private lateinit var menuProvider: MenuProvider 변수를 만들어준 후, onCreateView에서 위의 object : MenuProvider... 해줬던 부분을 부여해준다.

menuProvider = object : MenuProvider {
    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(R.menu.detail_menu, menu)
    }

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

            }
        }

        return true
    }

}

(requireActivity() as MenuHost).addMenuProvider(menuProvider)

이후 onStop()에서 (requireActivity() as MenuHost).removeMenuProvider(menuProvider)을 해주면, 메뉴가 겹치지 않고 말끔하게 뜬다. (코드단은 더러운 것 같아)

새 포스트 작성에 대한 Fragment, 설정에 대한 Fragment가 이제 필요하고, 또 submenu에 기능을 달아주는 것이 필요하겠지만, 일단은 역시 메인스트림에 집중하자. 다음 작업으로 바로 이제 LogIn, List, Detail에 대해 Data Binding + LiveData 관련 작업에 들어갈 수 있겠다.