为了优化 onActivityCreated 和 onCreateOptionsMenu 并避免使用过期方法,建议采用以下现代 Android 开发实践:

  1. 移除 onActivityCreated:该方法已弃用。原本在其中调用的 setHasOptionsMenu(true) 也可以移除。
  2. 使用 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方法中。