web-dev-qa-db-fra.com

comment supprimer la vue de navigation inférieure et la barre d'outils dans certains fragments si vous utilisez le contrôleur de navigation?

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.

comme ça : enter image description here

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 enter image description here

AuthActivity en tant que fragment d'hôte nav enter image description here

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?

9
Alexa289

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).

7
Rvb84

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
    }
0
loics2