How to hide bottom nav bar in fragment
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.
Related videos on Youtube
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, 2022Comments
-
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 about 5 years,How can I access this Bottom nav bar in my fragments
-
Brahma Datta about 5 yearsHaven't you implemented the bottom navigation bar in the MainActivity where the activity is shared by Fragments? @Digvijay
-
Digvijay about 5 yearsThanks bro ,that worked fine but bottom nav bar is hiding instantly how can I hide it smoothly.
-
Brahma Datta about 5 yearsHey if it's working then please accept my answer and upvote it, please. As it reaches more people @Digvijay
-
Digvijay about 5 yearsBottom navbar is hiding instantly how can I make it hiding smoothly.
-
bautista about 5 yearsDid you impelement the
BottomNavigationViewBehavior
as suggested by @Brahma Datta? -
Brahma Datta about 5 yearsUse Delay concept on those listeners . It may fix that problem @Digvijay
-
Digvijay about 5 yearsI am using reyclerview.addonScrollListener() method let me know how can I add delay.
-
Digvijay about 5 yearsboth 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 about 5 yearsLet us continue this discussion in chat.
-
sudhakara k s over 4 yearsIt will make the tight Coupling between Fragment and Android
-
JMB about 4 yearsYou can make it invisible when within a certain fragment, but when you click back it remains invisible. How can that be fixed?
-
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 about 4 yearsI 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 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.