如何使用导航从其他片段中隐藏主机 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()
}
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()
}