如何使用新的 MenuProvider 将项目添加到菜单栏?

问题描述 投票:0回答:2

这里是一个非常初学者的问题。由于在片段中使用“setHasOptionsMenu(true)”的旧范例最近在 Android Studio 中被弃用,我一直在尝试将我的应用程序转换为文档中概述的最新方案。关于这个的所有解释我可以从所述文档中找到以下代码片段的中心:

/**
  * Using the addMenuProvider() API directly in your Activity
  **/
class ExampleActivity : ComponentActivity(R.layout.activity_example) {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Add menu items without overriding methods in the Activity
   addMenuProvider(object : MenuProvider {
      override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        // Add menu items here
        menuInflater.inflate(R.menu.example_menu, menu)
      }

      override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // Handle the menu selection
        return true
      }
    })
  }
}

/**
  * Using the addMenuProvider() API in a Fragment
  **/
class ExampleFragment : Fragment(R.layout.fragment_example) {

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    // The usage of an interface lets you inject your own implementation
    val menuHost: MenuHost = requireActivity()
  
    // Add menu items without using the Fragment Menu APIs
    // Note how we can tie the MenuProvider to the viewLifecycleOwner
    // and an optional Lifecycle.State (here, RESUMED) to indicate when
    // the menu should be visible
    menuHost.addMenuProvider(object : MenuProvider {
      override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        // Add menu items here
        menuInflater.inflate(R.menu.example_menu, menu)
      }

      override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // Handle the menu selection
        return true
      }
    }, viewLifecycleOwner, Lifecycle.State.RESUMED)
  }

现在,我尝试将这段代码添加到我的主要活动(扩展 AppCompatActivity() )和相关片段中。无论它说“R.menu.example_menu”,我都插入了我自己的菜单布局文件,大部分时间基本上只包含一个设置项。

然而,虽然代码编译没有错误,但菜单栏实际上没有添加任何项目。我错过了什么?我是否应该在显示“在此处添加菜单项”的地方手动添加项目?不过,写个"menu.add("Settings")之类的好像也没有效果。

android kotlin menu toolbar deprecated
2个回答
0
投票

最简单的方法是让你的片段实现 MenuProvider 接口:

class ExampleFragment : Fragment(R.layout.fragment_example), MenuProvider { ...

然后,在片段的

onViewCreated
方法上,调用
addMenuProvider
方法:

requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)

然后,你只需要实现接口方法:

override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
    menuInflater.inflate(R.menu.example_menu, menu)
}

override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
    // Handle the menu selection
    return true
}

-1
投票

在主要活动中尝试以下操作:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_example)

换句话说,使用

AppCompatActivity()
而不是
ComponentActivity()
,因为
AppCompatActivity()
延伸
FragmentActivity
延伸
ComponentActivity()
.

  • 确保使用 androidX 依赖项(导入
    androidx.appcompat.app.AppCompatActivity

另外,我不确定你有什么项目,但这可能是因为它们在 xml 文件中的限制。 例如,如果您有一个 TextView 并且您使用了

tools:text="toolsText
,您将看不到文本,因为它仅用于 Android Studio 布局预览,并且在您运行应用程序时不会显示文本。

希望对您有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.