61 votes

Masquer/Afficher la vue de navigation inférieure lors du défilement des pages

Je dois masquer la vue de navigation inférieure lors du défilement vers le haut et l'afficher lors du défilement vers le bas. Comment mettre cela en œuvre ? Ma mise en page est la suivante

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_above="@+id/navigation"
        android:layout_alignParentTop="true"
        android:layout_marginBottom="5dp">

        <FrameLayout
            android:id="@+id/container1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
          />

    </LinearLayout>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="?android:attr/windowBackground"
        app:layout_scrollFlags="scroll|enterAlways|snap"
        app:menu="@menu/dashboard_slider_menu" />

</RelativeLayout>

J'ai joint une capture d'écran de la vue. Veuillez la vérifier.

enter image description here

0 votes

Qu'avez-vous essayé ?

1 votes

Ajoutez un écouteur d'événements/gestes à votre vue de liste / vue de recyclage. Cachez/affichez en fonction de l'événement.

0 votes

Utilisez-vous RecyclerView ?

147voto

Abhishek Singh Points 3835

UPDATE Il suffit d'ajouter un attribut à BottomNavigationView

Bibliothèque matérielle AndroidX

<com.google.android.material.bottomnavigation.BottomNavigationView
 ....
 app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"/>

Version de la bibliothèque de soutien 28.0.0 o higher version

<android.support.design.widget.BottomNavigationView
 ....
 app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"/>

Note :- Votre XML doit suivre la structure de XML donnée ci-dessous dans l'ancienne réponse.

**OLD ANSWER(Still Works)**

Vous avez besoin d'une classe d'aide pour faire cela. Cette solution fonctionne comme suit Directive Google Material Design.

Créer une classe BottomNavigationViewBehavior

public class BottomNavigationViewBehavior extends CoordinatorLayout.Behavior<BottomNavigationView> {

    private int height;

    @Override
    public boolean onLayoutChild(CoordinatorLayout parent, BottomNavigationView child, int layoutDirection) {
        height = child.getHeight();
        return super.onLayoutChild(parent, child, layoutDirection);
    }

    @Override
    public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout,
                                   BottomNavigationView child, @NonNull 
                                   View directTargetChild, @NonNull View target,
                                   int axes, int type)
    {
        return axes == ViewCompat.SCROLL_AXIS_VERTICAL;
    }

    @Override
    public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull BottomNavigationView child,
               @NonNull View target, int dxConsumed, int dyConsumed,
               int dxUnconsumed, int dyUnconsumed, 
                @ViewCompat.NestedScrollType int type)
    {
       if (dyConsumed > 0) {
           slideDown(child);
       } else if (dyConsumed < 0) {
           slideUp(child);
       }
    }

    private void slideUp(BottomNavigationView child) {
        child.clearAnimation();
        child.animate().translationY(0).setDuration(200);
    }

    private void slideDown(BottomNavigationView child) {
        child.clearAnimation();
        child.animate().translationY(height).setDuration(200);
    }
}

Pour utiliser ce comportement, vous devez utiliser la disposition de cooradinator...

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.kliff.digitaldwarka.activity.MainActivity">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinator_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/myAppBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:descendantFocusability="beforeDescendants"
            android:focusableInTouchMode="true"
            android:theme="@style/AppTheme.AppBarOverlay"
            app:elevation="0dp">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:contentInsetStart="0dp"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>
        </android.support.design.widget.AppBarLayout>

        <!---your RecyclerView/Fragment Container Layout-->
        <FrameLayout
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             app:layout_behavior="@string/appbar_scrolling_view_behavior" />

         <android.support.design.widget.BottomNavigationView
             android:id="@+id/bottom_nav"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="bottom"
             app:itemBackground="@color/white"
             app:menu="@menu/bottom_nav_menu" />

      </android.support.design.widget.CoordinatorLayout>

      <!---NavigationView-->
</android.support.v4.widget.DrawerLayout>

Ajoutez ce code à votre activité qui contient une nav inférieure

mBottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_nav);
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) mBottomNavigationView.getLayoutParams();
    layoutParams.setBehavior(new BottomNavigationViewBehavior());

0 votes

@Abhishek Singh Si ce FrameLayout est le conteneur d'un Fragment et que le RecyclerView est dans l'item du ViewPager, comment faire ?

0 votes

@Zys.. Il fonctionnera si vous chargez le fragment à l'intérieur de la mise en page du cadre... en fait, je fais la même chose... ma mise en page du cadre est conatainer fragment... mais encore si ne fonctionne pas alors vous pouvez faire NestedScrollView est le parent de vos fragments... et recyclerview.setNestedScrollEnabled(false); cela marchera à coup sûr

0 votes

@AbhishekSingh Merci, je vais essayer.

18voto

Rashmi Bhandari Points 322

Essayez ça,

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                if (dy > 0 && bottom_navigation.isShown()) {
                    bottom_navigation.setVisibility(View.GONE);
                } else if (dy < 0 ) {
                    bottom_navigation.setVisibility(View.VISIBLE);

                }
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

                super.onScrollStateChanged(recyclerView, newState);
            }
        });

Image pendant le défilement vers le haut :-

click here for scrolling up image

Image en défilant vers le bas :

click here for scrolling down image

0 votes

Comment masquer la navigation inférieure lorsqu'aucun élément n'est trouvé. J'utilise Visibility GONE, mais le problème est que lors du défilement de la vue du recycleur, l'ombre de la navigation inférieure s'affiche maintenant.

0 votes

Pouvez-vous ajouter la capture d'écran parce que normalement, elle ne le fait pas.

0 votes

Veuillez regarder sous cette image.

12voto

sunadorer Points 1742

Réponse actualisée après les dernières mises à jour de la bibliothèque :

Cacher le BottomNavigationView sur le défilement est maintenant disponible avec un seul drapeau dans la mise en page ! A partir de la version 28.0.0-alpha1 ou le matériau/androïdeX 1.0.0-alpha1 .

J'ai mis à jour mon projet en utilisant cette dernière approche puisque la version actuelle est une version stable candidate. Mise à jour : Utiliser la version complète "1.0.0" !

Le nouveau comportement disponible d'emblée s'appelle HideBottomViewOnScrollBehavior . Réglez-le sur le BottomNavigationView comme app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" comme décrit dans la dernière docs .

Voici un exemple complet :

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:labelVisibilityMode="selected"
        app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
        android:layout_gravity="bottom"
        app:layout_insetEdge="bottom"
        app:menu="@menu/navigation" />

Comme pour le masquage de la barre d'outils lors du défilement, il faut s'assurer que le contenu est une qui supporte le dernier défilement comme RecyclerView y NestedScrollView .

Cela permet de s'assurer que tout fonctionne comme indiqué dans le animation sur les spécifications de conception

PS : labelVisibilityMode est un autre ajout cool que vous obtenez gratuitement pour avoir pris la peine de mettre à jour et qui est décrit en profondeur dans le document caractéristiques de conception .

2 votes

Si dans un onglet je fais disparaître la barre de défilement vers le haut (comme prévu) et que lorsque je fais marche arrière et que je passe à un autre onglet, l'onglet est toujours caché, comment le faire apparaître ?

0 votes

@Choletski j'ai le même problème et je pose une question SO stackoverflow.com/questions/54865536/

12voto

Lefty Points 63
  1. Mettez à jour votre projet vers Androidx, c'est-à-dire Refactor >> Migrer vers androidx (Version minimale Android studio 3.4)
  2. À l'aide du fichier xml par défaut du menu de navigation inférieur, remplacez le parent Mise en page sous contrainte avec mise en page du coordinateur .
  3. Ajoutez la ligne app:layout_behavior="com.google.Android.material.behavior.HideBottomViewOnScrollBehavior"

i.e

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".dashboards.Admin_dashboard_main">

    <include layout="@layout/toolbar" />
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/main_area"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_margin="0dp"
        android:padding="0dp">

        <!-- Fragments Container -->
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            tools:context="MainActivity"
            tools:showIn="@layout/activity_tenant_dashboard"
            android:id="@+id/fragment_container">

        </FrameLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
    <!-- Bottom Navigation View -->

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        android:layout_gravity="bottom"
        app:menu="@menu/menu_admin_dashboard_main"
        app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"
        />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

3voto

Anil Points 1220

Utilisez cette

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
        {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy)
            {
                if (dy > 0 ||dy<0 && csButtonLay.isShown())
                {
                    bottomBar.setVisibility(View.GONE);
                }
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState)
            {
                if (newState == RecyclerView.SCROLL_STATE_IDLE)
                {
                    bottomBar.setVisibility(View.VISIBLE);
                }

                super.onScrollStateChanged(recyclerView, newState);
            }
        });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X