MenuProvider

2023. 12. 15. 13:53개발/Android

setHasOptionsMenu() , onCreateOptionsMenu(), onOptionsItemSelected() 는 Deprecated 되었다…………….

그렇다면 대체제는 무엇일까?

 

MenuProvider

  • 4개의 메소드를 포함한 인터페이스이다

  1. onCreateMenu : menu를 inflate하는 부분
  1. onMenuItemSelected : option메뉴를 클릭할 때 발생하는 부분
  1. onPrepareMenu : menu item을 customizing하는 부분. visibility나 menuItem의 customize를 할 수 있다
  1. onMenuClosed : 메뉴 닫히면 발생하는 부분

MenuHost

  • ComponentActivity, AppCompatActivity에 implement된 인터페이스. menu provider를 사용해 추가된 메뉴들의 control 메소드를 제공함

  1. addMenuProvider() : 3개의 케이스로 사용 가능하다
// 1. It only takes 1 parameter - [MenuProvider]

/*
* We need to manually remove the MenuProvider by calling removeMenuProvider().
* */
addMenuProvider(object : MenuProvider {
    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(R.menu.main_menu, menu)
    }
    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        return when (menuItem.itemId) {
            R.id.settings -> {
                true
            }
            else -> false
        }
    }
})

// 2. It takes 2 parameters - [MenuProvider, LifeCycleOwner]

/*
* Adds the given MenuProvider to the MenuHost. 
  MenuProvider will be removed once the given LifecycleOwner receives an Lifecycle.Event.ON_DESTROY event.
* */
addMenuProvider(object : MenuProvider {
    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(R.menu.main_menu, menu)
    }
    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        return when (menuItem.itemId) {
            R.id.settings -> {
                Toast.makeText(this@MainActivity, "Settings...", Toast.LENGTH_SHORT).show()
                true
            }
            else -> false
        }
    }
}, /*lifecycleOwner*/ this)


// 3. It takes 3 parameters - [MenuProvider, LifeCycleOwner, Lifecycle.State]

/*
* Adds a MenuProvider to the MenuHost when a given LifecycleOwner reaches a given Lifecycle.State. 
  LifecycleOwners will be removed once they reach a lower Lifecycle.State.
* */
addMenuProvider(object : MenuProvider {
    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(R.menu.main_menu, menu)
    }
    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        return when (menuItem.itemId) {
            R.id.settings -> {
                Toast.makeText(this@MainActivity, "Settings...", Toast.LENGTH_SHORT).show()
                true
            }
            else -> false
        }
    }
}, /*lifecycleOwner*/ this, /*Lifecycle.State*/ Lifecycle.State.RESUMED)

  1. invalidateMenu()
  1. removeMenuProvider()

Activity에 menu를 등록하기

addMenuProvider(object : MenuProvider {
    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(R.menu.main_menu, menu)
    }
    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        return when (menuItem.itemId) {
            R.id.settings -> {
                Toast.makeText(this@MainActivity, "Settings...", Toast.LENGTH_SHORT).show()
                true
            }
            else -> false
        }
    }
})

Fragment에 menu를 등록하기

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // Add options menu to the toolbar
    requireActivity().addMenuProvider(object : MenuProvider {
        override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
            menuInflater.inflate(R.menu.main_menu, menu)
        }
        override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
            return when (menuItem.itemId) {
                R.id.settings -> {
                    true
                }
                else -> false
            }
        }
    }, viewLifecycleOwner)
}


Uploaded by N2T

'개발 > Android' 카테고리의 다른 글

Android SSL Pinning  (0) 2023.12.15
Android의 모듈식 접근 방식  (0) 2023.12.15
메모리 누수의 원인 10가지  (0) 2023.12.15
Android 에서 TDD를 습관화하기  (0) 2023.11.30
Useful modifier  (0) 2023.11.30