【发布时间】:2021-08-21 10:58:48
【问题描述】:
我已经尝试了几乎所有的答案:
但效果不好:
我有一个活动:
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">
所以,在 nav_graph 内部,起始目的地是一个由各种选项卡组成的 ViewPagerFragment。
现在,我在 ViewPager 中的第一个目的地是 - SongsFragment
当我从 activity_main 中单击 bottom_controls 视图时,我正在导航到 SongDetailsFragment,如下所示:
MainActivity.kt
//on click song details
fun onSongInfoClick(v: View) {
val navController = findNavController(R.id.nav_host_fragment)
navController.navigateUp() // to clear previous navigation history
navController.navigate(R.id.songDetailsFragment)
}
这就是我想要的:
当在 SongDetailsFragment 中时:
- 隐藏 activity_main 中的 bottom_controls
在其他地方时:
- 在 activity_main 中显示 bottom_controls
现在:这是当前行为。
第一次可以用,后来试了就不行了,可以看到:
- 我第一次单击 bottom_controls 时,它隐藏在 songDetailsFragment 中(应该如此),但随后它显示在 songDetailsFragment 中。
这是我隐藏/显示 bottom_control 视图的方式:
在 MainActivity.kt
songDetailViewModel.currentData.observe(this) {
if (it.id !in arrayOf(0L, -1L, -2L)) {
if (getCurrentVisibleFragment(this) == null){
viewModel.showMiniPlayer()
} else viewModel.hideMiniPlayer()
} else viewModel.hideMiniPlayer()
}
在 SongDetailsFragment.kt
class SongDetailsFragment : BaseSongDetailFragment() {
.....
}
BaseSongDetailsFragment.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
if (GeneralUtility.getCurrentVisibleFragment(requireActivity()) == SongDetailsFragment()){
mainViewModel.hideMiniPlayer()
}
else{
mainViewModel.showMiniPlayer()
}
}
}
最后,这是 getCurrentVisibleFragment() 函数
//check if song details fragment
fun getCurrentVisibleFragment(activity: Activity): SongDetailsFragment? {
val navHostFragment = (activity as FragmentActivity).supportFragmentManager.primaryNavigationFragment as NavHostFragment
val fragmentManager: FragmentManager = navHostFragment.childFragmentManager
val songDetailsFragment: Fragment? = fragmentManager.primaryNavigationFragment
return if (songDetailsFragment is SongDetailsFragment) {
songDetailsFragment as SongDetailsFragment
} else null
}
【问题讨论】:
标签: android xml android-studio kotlin navigation