Android newbe在这里,我试图在MainActivity的膨胀菜单中获取菜单选项,以触发到另一个屏幕的导航,我遇到的问题是为findNavController()找到MainActivity的 View ,我需要在放置它的地方????,有人可以帮忙吗?

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(findViewById(R.id.toolbar))
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.menu_main, menu)
    return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.

    when (item.itemId) {

        R.id.menu_settings -> {
            val controller: NavController = Navigation.findNavController(????)
            controller.navigate(R.id.settingsFragment)
        }

        else -> super.onOptionsItemSelected(item)
    }
    return true
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.ebookfrenzy.sos.MainActivity">
<item
    android:id="@+id/menu_settings"
    android:orderInCategory="11"
    android:title="@string/action_settings"
    app:showAsAction="never" />

<item
    android:id="@+id/menu_removeads"
    android:orderInCategory="20"
    android:title="@string/remove_ads"
    app:showAsAction="never" />

<item
    android:id="@+id/menu_about"
    android:orderInCategory="20"
    android:title="@string/about"
    app:showAsAction="never"/>

最佳答案

按照documentation的建议,您需要执行以下操作之一:

  • Fragment.findNavController()
  • View.findNavController()
  • Activity.findNavController(viewId:Int)

  • 如何使用以上信息:
    您的代码位于MainActivity中,因此您必须调用的函数是第3个Activity.findNavController(viewId: Int),而????是viewId。
    什么是viewId:
    viewId是R.id.theIdentifierYouSetInYourXML,因此您必须在代码中导航到在setContentView方法中设置的布局,此布局称为R.layout.activity_main或xml单词activity_main.xml。在此文件中,应该有类似以下内容的内容:
    <?xml version="1.0" encoding="utf-8"?>
    <!-- irrelevant code  -->
    
        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
    
    ...
    
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_graph" />
    
        <!-- irrelevant code  -->
    
    FragmentContainerView在这里很重要。我们需要它的ID。在上面的示例中,答案将是R.id.nav_host_fragment
    放在一起:Navigation.findNavController(????)将为Activity.findNavController(R.id.nav_host_fragment),但您必须在activity_main.xml中检查代码以查找自己的ID。
    如果您的activity_main.xml中没有此代码,那么我建议从here开始。

    10-04 10:32