如何使用导航从其他片段中隐藏主机 activity 中的视图

How to hide a view in the host activity from other fragment using navigation

activity_main.xml

 <androidx.fragment.app.FragmentContainerView
   android:id="@+id/nav_host_fragment"
   android:name="androidx.navigation.fragment.NavHostFragment"
   android:layout_width="0dp"
   android:layout_height="0dp"
   app:layout_constraintLeft_toLeftOf="parent"
   app:layout_constraintRight_toRightOf="parent"
   app:layout_constraintTop_toTopOf="parent"
   app:layout_constraintBottom_toBottomOf="parent"
   app:defaultNavHost="true"
   app:navGraph="@navigation/nav_graph" >
</androidx.fragment.app.FragmentContainerView>

<androidx.constraintlayout.widget.ConstraintLayout
  android:id="@+id/bottom_controls"
  android:layout_width="match_parent"
  android:layout_height="72dp"
  android:onClick="onSongInfoClick"
  android:background="@drawable/lyt_rounded_bottom_music"
  android:paddingStart="10dp"
  android:paddingEnd="10dp"
  android:elevation="25dp"
  app:layout_constraintTop_toBottomOf="@id/nav_host_fragment">

起始目标是一个 ViewPagerFragment,由各种选项卡组成。

当我从 activity_main 单击 bottom_controls 视图时,我正在导航到 SongDetailsFragment

我不想在 songDetailsFragment

中显示 bottom_controls

以下是我的尝试方式:

MainActivity.kt

val currentFragment = supportFragmentManager.currentNavigationFragment
if(currentFragment !== SongDetailsFragment())
{
  viewModel.showMiniPlayer()
}
else{
  viewModel.hideMiniPlayer()
}

SongDetailsFragment.kt

class SongDetailsFragment : BaseSongDetailFragment() {
  .....
}

BaseSongDetailFragment.kt

 open class BaseSongDetailFragment : Fragment() {

 private val songDetailViewModel by sharedViewModel<SongDetailViewModel>()
 protected val mainViewModel by inject<MainViewModel>()


 override fun onActivityCreated(savedInstanceState: Bundle?) {
  super.onActivityCreated(savedInstanceState)
  showHideBottomSheet()
 }

 override fun onPause() {
 showHideBottomSheet()
 super.onPause()
 }

 override fun onResume() {
 showHideBottomSheet()
 super.onResume()
}

private fun showHideBottomSheet() {
 val currentData = songDetailViewModel.currentData.value ?: return
 if (currentData.id == 0L) return

 val currentFragment = 
 requireActivity().supportFragmentManager.currentNavigationFragment

 if(currentFragment ==  this as SongDetailsFragment){
    mainViewModel.hideMiniPlayer()
 }

 else{
     mainViewModel.showMiniPlayer()
  }
 } 
}

问题:

我第一次启动应用程序并导航到 songDetailsFragment,它显示 bottom_controls 视图。

随后,它没有显示。

我希望它完全不显示。

您可以在 activity 中使用 OnDestinationChangedListener 来监听 currentDestination 的变化。

navController.addOnDestinationChangedListener { _, destination, _ ->
    if (destination.id == R.id.songDetailsFragment)
        viewModel.hideMiniPlayer()
    else
        viewModel.showMiniPlayer()
}