How to hide bottom nav bar in fragment

30,456

Solution 1

To access your BottomNavigationView from within the fragments use the following code:

BottomNavigationView navBar = getActivity().findViewById(R.id.bottomBar);

Solution 2

navController.addOnDestinationChangedListener { _, destination, _ ->
   if(destination.id == R.id.full_screen_destination) {
       
       bottomNavigationView.visibility = View.GONE
   } else {
       
       bottomNavigationView.visibility = View.VISIBLE
   }
}

Do this in the main activity. Here R.id.full_screen_destination is id of the fragment in navigation fragment.

Solution 3

As the fragment is always inside an activity and you can call getActivity() in fragment to access objects that already exist in the activity. So you can do this:

Activity

public class MainActivity extends Activity {
//...
   Toolbar toolbar;
//...
   public Toolbar getNav() {
      return toolbar;
   }
//...
}

Fragment

//...
if(getActivity() != null && getActivity instanceOf MainActivity)
    ((MainActivity)getActivity()).getNav().setVisiblity(View.GONE);
//...

Solution 4

Try this,

Add this line in the BottomNavigationView in Xml

app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"

And Implement this BottomNavigation behavior using CoOrdinator Layout and you can hide or show the view using the scroll listeners.

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);
}

}

Add this line code to your Activity where it contains bottom navigation

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

Try this and let me know Digvijay.Happy Coding.

Share:
30,456

Related videos on Youtube

Digvijay
Author by

Digvijay

Love to solve problems using technology coding is my favourite past time.Founder of the failed startup currently open to you let's build something great together.

Updated on July 25, 2022

Comments

  • Digvijay
    Digvijay almost 2 years

    I have bottom nav bar define in the Main activity. I have three fragments linked with BottomNavigation bar in fragments I have recycler view so I want to hide BottomNavigation bar when RecyclerView scrolls down and shows when RecyclerView scrolls up. My problem is how can I access BottomNavigation bar in fragments because it is defined in MainActivity.

    This is my code:

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="0dp"
        android:background="@color/colorPrimary"
        android:paddingBottom="7dp"
        android:fitsSystemWindows="true">
    
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:layout_scrollFlags="scroll|enterAlways|snap">
    
            <Spinner
                android:layout_width="110dp"
                android:layout_height="50dp"
                android:id="@+id/chooseLocation"
                app:backgroundTint="@android:color/white"/>
    
        </android.support.v7.widget.Toolbar>
    
        <EditText
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:id="@+id/search"
            android:paddingTop="6dp"
            android:paddingBottom="6dp"
            android:paddingRight="6dp"
            android:paddingLeft="12dp"
            android:hint="Search here"
            android:textColorHint="#9e9e9e"
            android:textColor="#000"
            tools:ignore="HardcodedText"
            android:background="@drawable/search_edit_text"
            android:paddingEnd="6dp"
            android:paddingStart="12dp"/>
    
    </android.support.design.widget.AppBarLayout>
    
    <include layout="@layout/content_main" />
    
    <android.support.design.widget.BottomNavigationView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bottomBar"
        android:layout_gravity="bottom"
        app:menu="@menu/bottom_menu"
        android:background="#fff"
        app:itemIconTint="@drawable/nav_check"
        app:itemTextColor="@drawable/nav_check"/>
    
    </android.support.design.widget.CoordinatorLayout>
    

    fragment_home.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Tab1Fragment"
    android:background="#fff">
    
    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/purchasedBook"/>
    
    
    </RelativeLayout>
    

    This is how my fragments are defined as there is no bottom nav bar in any fragments so how can I access bottom nav bar in fragments.

    Someone, please let me know any help would be appreciated.

    THANKS

  • Digvijay
    Digvijay about 5 years
    ,How can I access this Bottom nav bar in my fragments
  • Brahma Datta
    Brahma Datta about 5 years
    Haven't you implemented the bottom navigation bar in the MainActivity where the activity is shared by Fragments? @Digvijay
  • Digvijay
    Digvijay about 5 years
    Thanks bro ,that worked fine but bottom nav bar is hiding instantly how can I hide it smoothly.
  • Brahma Datta
    Brahma Datta about 5 years
    Hey if it's working then please accept my answer and upvote it, please. As it reaches more people @Digvijay
  • Digvijay
    Digvijay about 5 years
    Bottom navbar is hiding instantly how can I make it hiding smoothly.
  • bautista
    bautista about 5 years
    Did you impelement the BottomNavigationViewBehavior as suggested by @Brahma Datta?
  • Brahma Datta
    Brahma Datta about 5 years
    Use Delay concept on those listeners . It may fix that problem @Digvijay
  • Digvijay
    Digvijay about 5 years
    I am using reyclerview.addonScrollListener() method let me know how can I add delay.
  • Digvijay
    Digvijay about 5 years
    both of your solution are working absolutely fine but to get access of bottom nav bar in my fragments I am using your solution as it is very short and simple.
  • Brahma Datta
    Brahma Datta about 5 years
  • sudhakara k s
    sudhakara k s over 4 years
    It will make the tight Coupling between Fragment and Android
  • JMB
    JMB about 4 years
    You can make it invisible when within a certain fragment, but when you click back it remains invisible. How can that be fixed?
  • bautista
    bautista about 4 years
    @JMB out of the blue i would say that you could handle the onBackPressed method in the calling activity and set the visibility there. Then delegate the processing to the fragment.
  • JMB
    JMB about 4 years
    I did just that, but it seems a little bit choppy the code. Wasn't sure if there was a cleaner way to do it. I called the method in the fragment which I wrote in the Activity, but then onbackpressed I have to add code to make the BottomNavView visible again because if not it stays GONE.
  • Ants
    Ants about 4 years
    @BrahmaDatta I tried your code but nothing happens. I have a fragment with a recyclerview that gets get loaded when my bottomNavigationView menu item is clicked. Maybe I have to go deeper to check scrolling activity? Any help would be appreciated.