Как скрыть представление в активности хоста от других фрагментов с помощью навигации

#android #xml #kotlin #navigation

Вопрос:

activity_main.xml

 lt;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" gt; lt;/androidx.fragment.app.FragmentContainerViewgt;  lt;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"gt;  

Начальное назначениеэто фрагмент страницы просмотра, состоящий из различных вкладок.

Когда я нажимаю на представление bottom_controls в activity_main, я перехожу к фрагменту songdetails

Я не хочу показывать, что bottom_controls в фрагменте songdetails

Вот как я пытаюсь это сделать:

Основная активность.тыс. т

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

Фрагмент песен.kt

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

Базовый фрагмент.kt

 open class BaseSongDetailFragment : Fragment() {   private val songDetailViewModel by sharedViewModellt;SongDetailViewModelgt;()  protected val mainViewModel by injectlt;MainViewModelgt;()    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()  }  }  }  

Проблема:

В самый первый раз, когда я запускаю приложение и перехожу к фрагменту songdetails, он показывает представление bottom_controls.

Впоследствии это не проявляется.

Я хочу, чтобы это вообще не было заметно.

Ответ №1:

Вы можете использовать OnDestinationChangedListener в своей деятельности для прослушивания изменений в текущем определении.

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

Комментарии:

1. Спасибо!!!!!!