为了优化 onActivityCreated 和 onCreateOptionsMenu 并避免使用过期方法,建议采用以下现代 Android 开发实践:
- 移除 onActivityCreated:该方法已弃用。原本在其中调用的 setHasOptionsMenu(true) 也可以移除。
- 使用 MenuProvider API:这是替代 onCreateOptionsMenu 和 onOptionsItemSelected 的推荐方式,它能更好地与生命周期结合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| private fun setupMenu() { val menuHost: MenuHost = requireActivity() menuHost.addMenuProvider(object : MenuProvider { override fun onCreateMenu( menu: Menu, menuInflater: MenuInflater ) { menuInflater.inflate(R.menu.menu_main, menu) }
override fun onMenuItemSelected(menuItem: MenuItem): Boolean { return when (menuItem.itemId) { R.id.action_contact -> { findNavController().navigate( DialFragmentDirections.actionDialFragmentToAccountFragment() ) true } R.id.action_history -> { findNavController().navigate( DialFragmentDirections.actionDialFragmentToHistoryFragment() ) true } R.id.action_setting -> { toggleList() true } else -> false } } }, viewLifecycleOwner, Lifecycle.State.RESUMED) }
|
- MenuProvider:这种方式不再依赖于 Fragment 内部的旧回调,而是将菜单逻辑封装在一个接口实现中。
- 生命周期感知:通过传递 viewLifecycleOwner 和 Lifecycle.State.RESUMED,系统会自动在 Fragment 视图销毁或不可见时移除菜单,避免了内存泄漏和菜单状态混乱。
- 代码解耦:将菜单逻辑抽取到 setupMenu() 中,使 initView 结构更清晰,且建议将initView放到onViewCreated方法中。
If you like my article, you can reward me to support my writing.

wechat

alipay