This article is about Android BottomNavigationView (represents a standard bottom navigation bar for application) and how to combine it with Fragments with the help of a simple application.
BottomNavigationView
- BottomNavigationView makes it easy for users to explore and switch between top-level views in a single tap.
- It should be used when the app has three to five top-level navigations.
- When there are two top-level destinations then use Tabs but If Destinations are more than five then use the Navigation Drawer.
- Bottom navigation should be used for Top-level destinations that need to be accessible from anywhere in the app.
- When the user taps on the icon it will change the top-level view accordingly.
The following is an example of the Bottom Navigation bar:
Creating new project
1 . Create a new project by going to File ⇒ New Android Project, select Empty Activity, provide app name, select language to kotlin and then finally click on finish.
2 . Open app-level build.gradle file, add the dependency of material design in the dependencies section, and sync the project.
build.gradle
dependencies {
//material design
implementation 'com.google.android.material:material:1.5.0-alpha01'
}
Find the latest version of the material design from here.
3 . As the Bottom Navigation items are rendered using a menu file, create a new xml file named bottom_navigation_menu.xml under res ⇒ menu folder.
bottom_navigation_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_home"
android:title="Home"
android:enabled="true"
android:icon="@drawable/ic_home"/>
<item
android:id="@+id/nav_search"
android:title="Search"
android:enabled="true"
android:icon="@drawable/ic_search"/>
<item
android:id="@+id/nav_radio"
android:title="Radio"
android:enabled="true"
android:icon="@drawable/ic_radio"/>
<item
android:id="@+id/nav_my_music"
android:title="My Music"
android:enabled="true"
android:icon="@drawable/ic_music"/>
<item
android:id="@+id/nav_library"
android:title="Library"
android:enabled="true"
android:icon="@drawable/ic_library"/>
</menu>
4 . Create a new Fragment (named HomeFragment.kt) for the home menu item by going to root ⇒ New ⇒ Fragment ⇒ Fragment (Blank).
HomeFragment.kt
package com.c1ctech.androidbottomnavviewexp
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class HomeFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_home, container, false)
}
companion object {
fun newInstance() = HomeFragment()
}
}
5 . Open fragment_home.xml and add the below TextView.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".HomeFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Home"
android:textSize="30sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
6 . Similarly, create fragments and their layout for the other four menu Items also.
7 . Open the layout file of the MainActivity i.e activity_main.xml, add BottomNavigationView widget and also add a FrameLayout to load the Fragments when the navigation item is selected.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/bottom_navigation"
/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:menu="@menu/bottom_navigation_menu"
android:background="@color/colorPrimary"
app:itemIconTint="@android:color/white"
app:itemTextColor="@android:color/white"/>
</RelativeLayout>
- app:menu : The menu resource file to display the navigation items along with icon and text.
- app:itemBackground : Applies background color to bottom navigation.
- app:itemTextColor: The text color of bottom navigation item.
- app:itemIconTint : The icon color of bottom navigation item.
The labelVisibilityMode attribute can be used to adjust the behavior of the text labels for each navigation item.
There are four visibility modes:
- LABEL_VISIBILITY_AUTO (default): The label behaves as “labeled” when there are 3 items or less, or “selected” when there are 4 items or more
- LABEL_VISIBILITY_SELECTED: The label is only shown on the selected navigation item
- LABEL_VISIBILITY_LABELED: The label is shown on all navigation items
- LABEL_VISIBILITY_UNLABELED: The label is hidden for all navigation items
8 . Open MainActivity.kt and add the below code:
MainActivity.kt
package com.c1ctech.androidbottomnavviewexp
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toolbar = getSupportActionBar();
loadFragment(HomeFragment.newInstance())
bottom_navigation.setOnItemSelectedListener { item ->
var fragment: Fragment
when (item.itemId) {
R.id.nav_home -> {
toolbar?.setTitle("Home")
fragment = HomeFragment()
loadFragment(fragment)
true
}
R.id.nav_radio -> {
toolbar?.setTitle("Radio")
fragment = RadioFragment()
loadFragment(fragment)
true
}
R.id.nav_search -> {
toolbar?.setTitle("Search")
fragment = SearchFragment()
loadFragment(fragment)
true
}
R.id.nav_my_music -> {
toolbar?.setTitle("My Music")
fragment = MyMusicFragment()
loadFragment(fragment)
true
}
R.id.nav_library -> {
toolbar?.setTitle("Library")
fragment = LibraryFragment()
loadFragment(fragment)
true
}
else -> false
}
}
bottom_navigation.setOnItemReselectedListener { item ->
when (item.itemId) {
R.id.nav_home -> {
Toast.makeText(this, "Home Item reselected", Toast.LENGTH_SHORT).show()
}
R.id.nav_radio -> {
Toast.makeText(this, "Radio Item reselected", Toast.LENGTH_SHORT).show()
}
R.id.nav_search -> {
Toast.makeText(this, "Search Item reselected", Toast.LENGTH_SHORT).show()
}
R.id.nav_my_music -> {
Toast.makeText(this, "My Music Item reselected", Toast.LENGTH_SHORT).show()
}
R.id.nav_library -> {
Toast.makeText(this, "Library Item reselected", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun loadFragment(fragment: Fragment) {
// load fragment
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit()
}
}
- loadFragment() – loads the Fragment into FrameLayout. It is also called in OnItemSelectedListener callback by passing the appropriate fragment instance.
- OnItemSelectedListener: listener that will be notified when a navigation item is selected.
- OnItemReselectedListener: listener that will be notified when the currently selected navigation item is reselected.
9 . Now if you run the project you can see the fragments loaded when navigation is selected.

