将片段中的菜单图标添加到主机活动工具栏 - 导航组件

Add menu icons from fragement into host actvity toolbar - Navigation component

我正在使用单个 activity 导航组件结构。 在主机 activity iam 中使用导航抽屉和底部导航。

所以底部导航中有 2 个片段 片段 A片段 B。 我需要为 Fragment A 添加菜单图标(搜索图标),为 Fragment B 添加(聊天图标)。

那么我如何从片段 在主机 Activity 工具栏上添加这些图标?

主机Activity

    private fun setupViews()
{
    drawerLayout = binding.drawerLayout

    // Finding the Navigation Controller
    navController = findNavController(R.id.hostFragmentLanding)

    // Setting Navigation Controller with the BottomNavigationView
    binding.bottomNavView.setupWithNavController(navController)

    appBarConfiguration = AppBarConfiguration(topLevelDestinationIds = TOP_LEVEL_DESTINATIONS, drawerLayout)
    // Set up ActionBar
    setSupportActionBar(binding.toolBar)
    setupActionBarWithNavController(navController, appBarConfiguration)
    binding.navigationView.setupWithNavController(navController)

}

override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}

override fun onBackPressed() {
    if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
        drawerLayout.closeDrawer(GravityCompat.START)
    } else {
        super.onBackPressed()
    }
}

host_activity_xml

    <?xml version="1.0" encoding="utf-8"?>

<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:fitsSystemWindows="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/appBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:elevation="0dp"
            android:fitsSystemWindows="true">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolBar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:title=""
                app:theme="@style/ToolbarTheme"
                >

                <ImageView
                    android:id="@+id/logo"
                    android:layout_width="97dp"
                    android:layout_height="@dimen/dp_20"
                    android:src="@drawable/logo_sportsal"
                    android:layout_gravity="center"
                   />


            </androidx.appcompat.widget.Toolbar>

        </com.google.android.material.appbar.AppBarLayout>


        <fragment
            android:id="@+id/hostFragmentLanding"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:navGraph="@navigation/navigation_landing" />


        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNavView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
            style="@style/Widget.MaterialComponents.BottomNavigationView"
            app:menu="@menu/bottom_navigation_menu"
            />

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        style="@style/Widget.MaterialComponents.NavigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start" />



</androidx.drawerlayout.widget.DrawerLayout>

我想将 Fragment A 中的菜单(搜索)图标添加到主机activity 工具栏

我直接从片段中添加了菜单图标 class

片段A

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    setHasOptionsMenu(true)

}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)
    inflater.inflate(R.menu.menu_home_fragment, menu)
    menu.findItem(R.id.search).isVisible = false
    menu.findItem(R.id.qrScan).isVisible = false
    menu.findItem(R.id.notification).isVisible = true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (item.itemId == R.id.search) {
    }
    return super.onOptionsItemSelected(item)
}

因此菜单项已自动添加到主机活动工具栏

我遇到了同样的问题,这个 anwser 解决了我的问题

我已经覆盖了我的片段中的 onCreateOptionsMenu 和 onOptionsItemSelected 函数,并且图标没有显示在工具栏中。我只需要将这些行添加到 activity

中的 onCreate 方法
    setSupportActionBar(binding.activityMainToolbar);
    getSupportActionBar()?.setDisplayShowTitleEnabled(false);