问题描述
我有一个带有底部导航的活动,当单击底部导航时,它将显示多个不同的导航以用于下一步开发。看起来像这样
然后在导航通知中显示通知片段。我计划的此片段在右上角有搜索操作栏。然后在配置文件导航中显示配置文件片段,该片段与通知片段相同。我有一个问题,我已经在NotificationFragment和ProfileFragment中实现了onCreateOptionMenu,但是在NotificationFragment中,操作栏没有显示
并且在Profile Fragment中显示了重复的ActionBar,如下所示。
当用户单击“搜索”图标时,我正在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 (将#修改为@)