使用不同的导航Android Studio在片段导航中复制OnCreateOption菜单工具栏

问题描述

我有一个带有底部导航的活动,当单击底部导航时,它将显示多个不同的导航以用于下一步开发。看起来像这样

Bottom Navigation

然后在导航通知显示通知片段。我计划的此片段在右上角有搜索操作栏。然后在配置文件导航中显示配置文件片段,该片段与通知片段相同。我有一个问题,我已经在NotificationFragment和ProfileFragment中实现了onCreateOptionMenu,但是在NotificationFragment中,操作栏没有显示

Profile Fragment

并且在Profile Fragment中显示了重复的ActionBar,如下所示。

Notification Fragment

用户单击“搜索”图标时,我正在NotificationFragment中实现Toast,但是在ProfileFragment上运行的Toast还是没有在ProfileFragment中的onoptionsItemSelected中实现任何功能

这是MyActivity的代码

class MainKoperasiActivity : BaseActivity() {
private lateinit var binding: ActivityMainBinding

@Inject
lateinit var viewmodel: Mainviewmodel

private lateinit var navControllerHome: NavController
private lateinit var navControllerProfile: NavController
private lateinit var navControllerNotification: NavController
private lateinit var navControllerDelivery: NavController

override fun onCreate(savedInstanceState: Bundle?) {
    AndroidInjection.inject(this)
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
    binding.viewmodel = viewmodel
    val hostHome: NavHostFragment =
        supportFragmentManager.findFragmentById(R.id.navHostHome) as NavHostFragment? ?: return
    val hostProfile: NavHostFragment =
        supportFragmentManager.findFragmentById(R.id.navHostProfile) as NavHostFragment? ?: return
    val hostNotification: NavHostFragment =
        supportFragmentManager.findFragmentById(R.id.navHostNotification) as NavHostFragment? ?: return
    navControllerHome = hostHome.navController
    navControllerProfile = hostProfile.navController
    navControllerNotification = hostNotification.navController

    binding.navView.setonNavigationItemSelectedListener { item ->
        val id = item.itemId

        if(id == R.id.navigation_home)
        {
            setAllFragmentGoneWithExceptFragment(binding.fragmentContainer0)
        }
        else if(id == R.id.navigation_notifications) {
            setAllFragmentGoneWithExceptFragment(binding.fragmentContainer1)
        }
        else if(id == R.id.navigation_profile) {
            setAllFragmentGoneWithExceptFragment(binding.fragmentContainer2)
        }

        true
    }
}

private fun setAllFragmentGoneWithExceptFragment(fragment: View) {
    binding.fragmentContainer0.visibility = View.GONE
    binding.fragmentContainer1.visibility = View.GONE
    binding.fragmentContainer2.visibility = View.GONE

    fragment.visibility = View.VISIBLE
}

override fun onBackpressed() {
    if(binding.navView.selectedItemId == R.id.navigation_home)
    {
        val isPopBackStack = navControllerHome.popBackStack()
        if (!isPopBackStack)
            super.onBackpressed()
    }
    else if(binding.navView.selectedItemId == R.id.navigation_profile)
    {
        val isPopBackStack = navControllerProfile.popBackStack()
        if (!isPopBackStack)
            binding.navView.selectedItemId = R.id.navigation_home
    }
    else
        binding.navView.selectedItemId = R.id.navigation_home
}

}

这是我的NotificationFragment的代码,实现onCreateOptionMenu和OnoptionItemSelected

class NotificationFragment : BaseFragment() {
private lateinit var binding: FragmentNotificationBinding
private lateinit var inflater: MenuInflater

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    retainInstance = true
    setHasOptionsMenu(true)
}

override fun onCreateView(
    inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
    binding = DataBindingUtil.inflate(inflater,R.layout.fragment_notification,container,false)
    return binding.root
}

override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
    super.onViewCreated(view,savedInstanceState)
    initToolbar()
}

private fun initToolbar() {
    (context as BaseActivity).setSupportActionBar(binding.toolbar)
    (context as BaseActivity).supportActionBar!!.title = getString(R.string.notification)
}

override fun onCreateOptionsMenu(menu: Menu,inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_news,menu)
    super.onCreateOptionsMenu(menu,inflater)
}

override fun onoptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        android.R.id.home -> (activity as BaseActivity).finish()
        R.id.actSearch -> {
            Toast.makeText(activity,"From Notification",Toast.LENGTH_SHORT).show()
        }
    }
    return true
}
}

这是我的复制操作栏ProfileFragment.kt

class ProfileFragment : BaseFragment() {
private lateinit var binding : FragmentProfileBinding
private lateinit var inflater: MenuInflater
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    retainInstance = true
    setHasOptionsMenu(true)
}

override fun onCreateView(
    inflater: LayoutInflater,savedInstanceState: Bundle?
): View? {
     binding = DataBindingUtil.inflate(
        inflater,R.layout.fragment_profile,false
    )
    return binding.root
}

override fun onViewCreated(view: View,savedInstanceState)
    initToolbar()
}

private fun initToolbar() {
    (context as BaseActivity).setSupportActionBar(binding.toolbar)
    (context as BaseActivity).supportActionBar!!.title = getString(R.string.profile)
}

override fun onCreateOptionsMenu(menu: Menu,inflater)
}

override fun onoptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        android.R.id.home -> (activity as BaseActivity).finish()
        R.id.actSearch -> {

        }
    }
    return true
}
}

这是我的fragment_notification和fragment_profile

<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ToolbarStyle"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        >

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:paddingEnd="@dimen/_10sdp"
            android:background="@color/colorPrimary"
            android:minHeight="?android:attr/actionBarSize"
            >

        </androidx.appcompat.widget.Toolbar>

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

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

这是我的活动

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable
        name="viewmodel"
        type="com.javaindoku.yotaniniaga.viewmodel.Mainviewmodel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.mainkoperasi.MainKoperasiActivity"
    android:background="@color/background_home"
    >

    <FrameLayout
        android:id="@+id/fragmentContainer0"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:elevation="40dp"
        android:visibility="visible">

        <fragment
            android:id="@+id/navHostHome"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="false"
            app:navGraph="@navigation/mobile_navigation_home" />
    </FrameLayout>

    <LinearLayout
        android:id="@+id/fragmentContainer1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:elevation="40dp"
        android:visibility="gone"
        android:orientation="vertical"
        >

        <fragment
            android:id="@+id/navHostNotification"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="false"
            app:navGraph="@navigation/mobile_navigation_notification" />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/fragmentContainer2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:elevation="40dp"
        android:visibility="gone">

        <fragment
            android:id="@+id/navHostProfile"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="false"
            app:navGraph="@navigation/mobile_navigation_profile" />
    </FrameLayout>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="@color/colorPrimary"
        app:labelVisibilityMode="labeled"
        app:itemIconTint="@drawable/bottom_nav_icon_color_selector"
        app:itemTextColor="@drawable/bottom_nav_icon_color_selector"
        app:itemTextAppearanceActive="@style/BottomNavigationView.Active"
        app:itemTextAppearanceInactive="@style/BottomNavigationView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
         />

</androidx.constraintlayout.widget.ConstraintLayout>

我希望我的NotificationFragment只显示一个搜索操作栏,所以当我单击搜索图标时,具有不同功能的ProfileFragment也要显示。我已经使用过menu.clear()和onPrepareOptionsMenu,但是仍然失败。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)