Library / SDK
st235/ExpandableBottomBar avatar
st235/ExpandableBottomBar

ExpandableBottomBar: an Android bottom bar that opens to show its menu

A new way to implement navigation in your app 🏎

788 stars56 forksKotlinMIT

At a glance

What is it?
ExpandableBottomBar is a Kotlin Android library that puts a Material-style bottom bar on screen and expands the selected item into a row of menu entries, with the whole thing configurable from XML. It supports minSdk 19 and is published on Maven Central, but the last release was in 2023 and the last push in May 2026, so it is worth checking the state of the project before you depend on it.
Who is it for?
Adopt ExpandableBottomBar if you are building an Android app that wants a bottom navigation bar which expands on tap rather than showing a flat row of icons, and if you are comfortable with a library that has not had a release since 2023. Do not adopt it for a new project that needs Material 3 navigation, since the library predates that and its attribute set is its own.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 171 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What it does: a bottom bar whose selected item expands into the menu

ExpandableBottomBar is a Kotlin Android library for a new way to improve navigation in your app, and the README's pitch is that it is really easy to integrate to your project. The library is published on Maven Central under the coordinates com.github.st235 with the artifact name expandablebottombar, and the badge reports a minimum Android SDK version of 19.

The interaction is the point. The bar sits at the bottom of the screen, and when you tap an item it expands to reveal the menu entries associated with it, rather than a flat row of icons that swaps the whole screen content. The animated gif at the top of the README is the entire demonstration, which is either a sign of how simple the idea is or a sign that the gif carries all the explanation there is.

Because the expanded state is a menu, the library treats its contents like a normal Android menu, and the README says as much with the comment Just like any Android menu. That is a sensible design decision. It means the model, the resource references and the icon handling are familiar, and you can point it at an existing menu resource rather than rebuilding one in code.

The repository is a standard Android library project rather than a sample app. The top level holds an app/ directory for the demo, the expandablebottombar/ directory with the library itself, build.gradle, settings.gradle, gradle.properties and the gradle wrapper. CI runs through CircleCI, with a CircleCI badge at the top of the README.

Adding the dependency, and the JCenter migration that trips people up

There is one integration step with a documented trap, and it is worth reading before anything else.

The library was migrated from JCenter to MavenCentral, which means it may be necessary to add the mavenCentral repository to your repositories list:

groovy
allprojects {
    repositories {
        // your repositories

        mavenCentral()
    }
}

That is the whole fix, and it exists because JCenter was wound down. If your build still relies on JCenter alone, the dependency will fail to resolve, and the error will look like a missing artifact rather than a missing repository. This is the single most likely integration problem with the library today.

Three dependency formats are documented, which tells you the project predates the current Android build conventions. For Maven:

text
<dependency>
  <groupId>com.github.st235</groupId>
  <artifactId>expandablebottombar</artifactId>
  <version>X.X</version>
  <type>pom</type>
</dependency>

For Gradle it is a single line, implementation 'com.github.st235:expandablebottombar:X.X', and for Ivy there is an org='com.github.st235' name='expandablebottombar' rev='X.X' form with an artifact element of type pom.

Note the type pom in the Maven and Ivy forms. The README also tells you to check the latest version code in the badge at the top of the page, so the version is not hardcoded in the guide.

Declaring the view in XML and populating the menu in code

Usage starts with the view, and the attribute names are prefixed exb_ so they do not collide with the standard Android ones.

xml
    <github.com.st235.expandablebottombar.ExpandableBottomBar
        android:id="@+id/expandable_bottom_bar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        app:exb_backgroundCornerRadius="25dp"
        app:exb_backgroundColor="#2e2e2e"
        app:exb_itemInactiveColor="#fff"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

The custom view is the fully qualified class name in the layout, and the exb_ attributes set the background color, the corner radius and the colour of items when they are inactive. The layout constraints place it at the bottom of the parent, and the zerodp width with start and end constraints is the usual pattern for a bar that spans the width.

The menu is then populated in code. You find the view, take its menu, and add items built with a descriptor:

kotlin
        val bottomBar: ExpandableBottomBar = findViewById(R.id.expandable_bottom_bar)
        val menu = bottomBar.menu

        menu.add(
            MenuItemDescriptor.Builder(
                this,
                R.id.icon_home,
                R.drawable.ic_home,
                R.string.text, 
                Color.GRAY
            )
                .build()
        )

The descriptor takes the context, an id, an icon drawable, a title and a colour. Two listeners are then attached, onItemSelectedListener for clicks on a new selection and onItemReselectedListener for clicks on the item that is already selected. The comments in the README spell out the difference, and they are the kind of distinction that is easy to get wrong: clicks on an already selected item do not fire the selection callback, they fire the reselect callback.

A static menu can come from XML, with per-item colour and badge overrides

If your menu is constant, the README suggests specifying it from XML instead of building it in code, and the item attributes are where the library adds something over a standard menu.

xml
    <item
        android:id="@+id/home"
        android:title="@string/text"
        android:icon="@drawable/ic_home"
        app:exb_color="#FF8888" />

    <item
        android:id="@+id/settings"
        android:title="@string/text4"
        android:icon="@drawable/ic_settings"
        app:exb_color="@color/colorSettings" />

The standard android:id, android:title and android:icon are there, and the vector drawables are supported. The addition is exb_color, which sets the colour of that element, and it accepts either a colour reference or a literal colour.

The attribute table also lists two badge attributes, and the descriptions carry an important caveat. exb_badgeColor is the notification badge background colour and it will override the colour from the layout attribute, and exb_badgeTextColor is the badge text colour and it will override the colour from the layout attribute too. So a badge can be coloured per item even though the bar itself has one inactive item colour.

Once the menu resource exists, the view references it through the exb_items attribute:

xml
    <github.com.st235.expandablebottombar.ExpandableBottomBar
        android:id="@+id/expandable_bottom_bar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        app:exb_backgroundCornerRadius="25dp"
        app:exb_itemInactiveColor="#fff"
        app:exb_items="@menu/bottom_bar"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

The difference from the earlier declaration is the single exb_items line, which is the whole switch between the two approaches.

The view level attributes cover elevation, timing and colours

The view level attribute table covers the appearance and behaviour of the bar as a whole, and one of the entries has a version requirement attached to it.

exb_elevation is the component elevation, and the description marks it as important for api 21 and above, which is consistent with the library's minSdk of 19 and the fact that elevation shadows arrived in Android 5. exb_backgroundColor sets the bottom bar background colour. exb_transitionDuration is an integer, the time between one item collapsing and another item expanded, which is the animation timing of the core interaction. exb_backgroundCornerRadius is a dimension for the bar's corner radius, which is what gives the bar its rounded, floating appearance. exb_itemInactiveColor is the item menu colour when that item is inactive.

The table in the README is cut off partway through, so the remaining view attributes are not visible there, and the documentation site referenced from the project is where the full list lives.

The combination to note is that the library draws the rounded floating bar look with its own attributes rather than inheriting it from a design library theme. The corner radius, the elevation and the inactive colour are all set by hand, which gives you control but also means you are not getting whatever the current Material Design version specifies.

Maintenance: a 2023 release and a 2026 push

The maintenance picture is the main thing to weigh before you pick this up.

The last push to the repository was on 2026-05-06, and the repository is not archived, so the code is still being touched. The release list, however, stops earlier. The most recent release is 1.5.3 from 2023-08-18, before that 1.5.1 in August 2022 and 1.4.2 in February 2022. So there are commits from 2026 and no new tagged release since 2023.

The licence is MIT, which is the permissive one and imposes no obligation on an application that ships it.

What this combination suggests is a project that is maintained in a low-key way rather than abandoned. Somebody is still committing to it, which is different from a library that was finished years ago and left alone, and it is different from one being actively released. For an Android UI library, the risk of that state is compatibility with new Android versions and with the Kotlin and Android Gradle Plugin versions you are on, since a library that is not released against current toolchains can pick up build problems in your app rather than its own.

The practical advice is to pin the version rather than track the badge, and to try the build early. Adding a Maven dependency is a small change, and finding out in week three of an integration that the library will not compile against your current toolchain is the expensive way to find out.

Editorial conclusion

Adopt ExpandableBottomBar if you are building an Android app that wants a bottom navigation bar which expands on tap rather than showing a flat row of icons, and if you are comfortable with a library that has not had a release since 2023. Do not adopt it for a new project that needs Material 3 navigation, since the library predates that and its attribute set is its own. Before you depend on it, check whether the mavenCentral repository is in your repositories list, because the project moved from JCenter and that migration is the most common integration failure, and pin version 1.5.3 rather than tracking whatever the badge shows.

Frequently asked questions

How do I add ExpandableBottomBar to an Android project?

Add the dependency with implementation 'com.github.st235:expandablebottombar:X.X', and make sure the mavenCentral repository is in your repositories list, since the library was migrated from JCenter and may not resolve without it.

How do I define the menu items for ExpandableBottomBar?

Either add them in code with MenuItemDescriptor.Builder and bottomBar.menu, or declare them in an XML menu resource and reference that resource from the view with the exb_items attribute. XML items accept an exb_color attribute for a per-item colour.

What is the difference between onItemSelectedListener and onItemReselectedListener?

Clicks on an already selected item do not fire the selection callback. The selection listener handles clicks that change the selection, and the reselect listener handles clicks on the item that is already selected.

Can I set a notification badge colour per menu item in ExpandableBottomBar?

Yes. The exb_badgeColor attribute sets the badge background colour and exb_badgeTextColor sets the badge text colour, and both override the corresponding colour from the layout attribute.

Official sources

  1. Issues
  2. License: MIT
  3. README
  4. Releases
  5. st235/ExpandableBottomBar on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/st235-expandablebottombar.svg)](https://hysenlabs.com/projects/st235-expandablebottombar)

Was this useful?