setHasOptionsMenu()
, onCreateOptionsMenu(), onOptionsItemSelected() 는 Deprecated 되었다…………….
그렇다면 대체제는 무엇일까?
MenuProvider
- 4개의 메소드를 포함한 인터페이스이다
- onCreateMenu : menu를 inflate하는 부분
- onMenuItemSelected : option메뉴를 클릭할 때 발생하는 부분
- onPrepareMenu : menu item을 customizing하는 부분. visibility나 menuItem의 customize를 할 수 있다
- onMenuClosed : 메뉴 닫히면 발생하는 부분
MenuHost
- ComponentActivity, AppCompatActivity에 implement된 인터페이스. menu provider를 사용해 추가된 메뉴들의 control 메소드를 제공함
- 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)
- invalidateMenu()
- 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