J'ai MainActivity en tant qu'hôte de mon contrôleur de navigation, il a une barre d'outils et une vue de navigation inférieure
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:background="?attr/colorPrimary"
Android:theme="?attr/actionBarTheme"
Android:minHeight="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<fragment
Android:id="@+id/nav_Host_fragment"
Android:layout_width="0dp"
Android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/bottom_nav"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
Android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/navigation_graph"
app:defaultNavHost="true"
/>
<Android.support.design.widget.BottomNavigationView
Android:layout_width="0dp"
Android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
Android:background="@color/colorPrimary"
app:itemIconTint="@color/color_bottom_view_navigation"
app:itemTextColor="@color/color_bottom_view_navigation"
app:menu="@menu/menu_bottom_view"
app:labelVisibilityMode="labeled"
Android:id="@+id/bottom_nav"/>
</Android.support.constraint.ConstraintLayout>
il hébergera quelques fragments comme menu pour la vue de navigation inférieure comme HomeFragment
, OrderFragment
, FavouriteFragment
, CartFragment
, ProfileFragment
.
disons qu'il y a un bouton logOut dans le HomeFragment
, et s'il est cliqué, il se déplacera vers l'écran de connexion. comme d'habitude, l'écran de connexion ou l'écran d'inscription n'a pas de vue de navigation inférieure et n'a pas non plus de barre d'outils.
alors, quelle est la meilleure façon de supprimer cette vue de navigation inférieure et également la barre d'outils si vous utilisez le contrôleur de navigation?
J'ai essayé d'utiliser <Include>
tag dans le graphique de mon contrôleur de navigation,
donc je fais deux graphiques de navigation, puis je fais 2 activités pour placer le fragment comme hôte. la première activité a une vue de navigation et une barre d'outils en bas (MainActivity, comme le xml que je partage ci-dessus) et l'autre activité n'a pas de vue de navigation et de barre d'outils en bas
le graphique de navigation ressemble à l'image ci-dessous:
MainActivity en tant que fragment d'hôte nav
AuthActivity en tant que fragment d'hôte nav
mais quand je passe de HomeFragment
(qui a un bouton de déconnexion) à LoginFragment
en utilisant ce code:
logout_button.setOnClickListener {
Navigation.findNavController(it).navigate(R.id.action_toAuthActivity)
}
mais dans l'écran de connexion, la vue de navigation inférieure et la barre d'outils sont toujours là
Je suppose que l'auth_graph (AuthActivity en tant qu'hôte) peut être utilisé pour héberger un écran qui n'a pas de navigation inférieure et une barre d'outils comme l'écran de connexion, l'écran d'inscription ou l'écran de mot de passe oublié.
mais .... je ne peux pas supprimer cette vue de navigation inférieure et la barre d'outils de cette façon
alors comment supprimer la vue de navigation inférieure et la barre d'outils dans certains fragments si vous utilisez le contrôleur de navigation?
Plus concis est d'utiliser un écouteur de navigation. De cette façon, vous n'avez besoin que d'une fonction dans votre activité principale et pas de code dans tous les fragments où vous souhaitez masquer la navigation inférieure ou tout autre élément d'interface utilisateur (comme la barre d'outils). Placez cette fonction dans votre onCreate à partir de votre MainActivity.
Ma fonction ressemble à ceci:
private fun visibilityNavElements(navController: NavController) {
navController.addOnDestinationChangedListener { _, destination, _ ->
when (destination.id) {
R.id.about_fragment,
R.id.settings_fragment,
R.id.detail_fragment,
R.id.missionPhotoFragment -> bottom_nav?.visibility = View.GONE
else -> bottom_nav?.visibility = View.VISIBLE
}
}
}
J'utilise Kotlin Android Extensions pour accéder directement aux vues par leur identifiant (pas besoin de findViewById).
Il semble qu'il n'y ait pas de solution simple actuellement implémentée dans NavigationUI.
J'ai fini par ajouter une méthode hideBottomBar
dans MainActivity
comme ceci:
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
hideBottomBar(false); // to have it visible by default
}
public void hideBottomBar(boolean isHidden){
bottomBar.setVisibility(isHidden ? View.GONE : View.VISIBLE);
}
Et puis, dans les fragments où la barre inférieure doit être cachée:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// layout inflating and stuff...
MainActivity activity = (MainActivity) getActivity();
if (activity != null)
activity.hideBottomBar(true);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
MainActivity activity = (MainActivity) getActivity();
if (activity != null)
activity.hideBottomBar(false); // to show the bottom bar when
// we destroy this fragment
}