Google's official Material Design components library for Android applications with comprehensive UI components, theming, and animations.
—
Components for app navigation including bottom navigation, navigation drawer, tabs, navigation rail, and app bars.
import com.google.android.material.navigation.NavigationView;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigationrail.NavigationRailView;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.search.SearchBar;
import com.google.android.material.search.SearchView;Bottom navigation bar for switching between top-level views.
class BottomNavigationView extends NavigationBarView {
BottomNavigationView(Context context);
BottomNavigationView(Context context, AttributeSet attrs);
// Selection listeners (deprecated - use NavigationBarView methods)
void setOnNavigationItemSelectedListener(OnNavigationItemSelectedListener listener);
void setOnNavigationItemReselectedListener(OnNavigationItemReselectedListener listener);
// Menu and selection
Menu getMenu();
void setSelectedItemId(@IdRes int itemId);
int getSelectedItemId();
// Badges
void setBadgeFor(@IdRes int menuItemId, BadgeDrawable badgeDrawable);
BadgeDrawable getBadgeFor(@IdRes int menuItemId);
void removeBadge(@IdRes int menuItemId);
// Styling
void setItemIconTintList(ColorStateList tint);
ColorStateList getItemIconTintList();
void setItemTextColor(ColorStateList textColor);
ColorStateList getItemTextColor();
void setItemBackgroundResource(@DrawableRes int resId);
void setItemBackground(Drawable background);
Drawable getItemBackground();
// Label visibility
void setLabelVisibilityMode(int mode);
int getLabelVisibilityMode();
}
interface BottomNavigationView.OnNavigationItemSelectedListener {
boolean onNavigationItemSelected(@NonNull MenuItem item);
}
interface BottomNavigationView.OnNavigationItemReselectedListener {
void onNavigationItemReselected(@NonNull MenuItem item);
}BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
// Handle navigation selection
bottomNav.setOnItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.nav_home:
// Navigate to home
return true;
case R.id.nav_search:
// Navigate to search
return true;
case R.id.nav_profile:
// Navigate to profile
return true;
default:
return false;
}
});
// Configure badges
BadgeDrawable badge = bottomNav.getOrCreateBadge(R.id.nav_notifications);
badge.setNumber(5);
badge.setVisible(true);
// Set selected item
bottomNav.setSelectedItemId(R.id.nav_home);Navigation drawer for hierarchical navigation and app-level options.
class NavigationView extends ScrimInsetsFrameLayout {
NavigationView(Context context);
NavigationView(Context context, AttributeSet attrs);
// Selection handling
void setNavigationItemSelectedListener(OnNavigationItemSelectedListener listener);
// Menu management
Menu getMenu();
void inflateMenu(@MenuRes int resId);
// Header views
View getHeaderView(int index);
int getHeaderCount();
View inflateHeaderView(@LayoutRes int res);
void addHeaderView(View view);
void removeHeaderView(View view);
// Selection state
void setCheckedItem(@IdRes int id);
void setCheckedItem(MenuItem menuItem);
MenuItem getCheckedItem();
// Item styling
void setItemIconTintList(ColorStateList tint);
ColorStateList getItemIconTintList();
void setItemTextColor(ColorStateList textColor);
ColorStateList getItemTextColor();
void setItemBackground(Drawable itemBackground);
Drawable getItemBackground();
void setItemBackgroundResource(@DrawableRes int resId);
// Item layout
void setItemHorizontalPadding(@Dimension int padding);
int getItemHorizontalPadding();
void setItemHorizontalPaddingResource(@DimenRes int paddingResource);
void setItemIconPadding(@Dimension int padding);
int getItemIconPadding();
void setItemIconPaddingResource(@DimenRes int paddingResource);
void setItemMaxLines(int itemMaxLines);
int getItemMaxLines();
}
interface NavigationView.OnNavigationItemSelectedListener {
boolean onNavigationItemSelected(@NonNull MenuItem menuItem);
}NavigationView navigationView = findViewById(R.id.nav_view);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
// Handle navigation selection
navigationView.setNavigationItemSelectedListener(menuItem -> {
switch (menuItem.getItemId()) {
case R.id.nav_dashboard:
// Navigate to dashboard
break;
case R.id.nav_settings:
// Navigate to settings
break;
case R.id.nav_logout:
// Handle logout
break;
}
// Close drawer
drawer.closeDrawer(GravityCompat.START);
return true;
});
// Setup header
View headerView = navigationView.getHeaderView(0);
TextView userName = headerView.findViewById(R.id.user_name);
userName.setText("John Doe");
// Set selected item
navigationView.setCheckedItem(R.id.nav_dashboard);Vertical navigation rail for tablet and desktop layouts.
class NavigationRailView extends NavigationBarView {
NavigationRailView(Context context);
NavigationRailView(Context context, AttributeSet attrs);
// Header view
void setHeaderView(View headerView);
View getHeaderView();
void addHeaderView(View headerView);
void removeHeaderView();
// Menu positioning
int getMenuGravity();
void setMenuGravity(int gravity);
// Item size
int getItemMinimumHeight();
void setItemMinimumHeight(@Dimension int minHeight);
}public static final int GRAVITY_TOP = 48;
public static final int GRAVITY_CENTER = 17;
public static final int GRAVITY_BOTTOM = 80;NavigationRailView navigationRail = findViewById(R.id.navigation_rail);
// Add header (like FAB)
FloatingActionButton fab = new FloatingActionButton(this);
fab.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_add));
navigationRail.setHeaderView(fab);
// Configure menu positioning
navigationRail.setMenuGravity(NavigationRailView.GRAVITY_CENTER);
// Handle selection
navigationRail.setOnItemSelectedListener(item -> {
// Handle navigation selection
return true;
});Horizontal tabs for organizing content into logical groups.
class TabLayout extends HorizontalScrollView {
TabLayout(Context context);
TabLayout(Context context, AttributeSet attrs);
// Tab management
Tab newTab();
void addTab(Tab tab);
void addTab(Tab tab, boolean setSelected);
void addTab(Tab tab, int position);
void addTab(Tab tab, int position, boolean setSelected);
void removeTab(Tab tab);
void removeTabAt(int position);
void removeAllTabs();
// Tab access
int getTabCount();
Tab getTabAt(int index);
int getSelectedTabPosition();
// Selection
void selectTab(Tab tab);
void selectTab(Tab tab, boolean updateIndicator);
// Selection listeners
void addOnTabSelectedListener(OnTabSelectedListener listener);
void removeOnTabSelectedListener(OnTabSelectedListener listener);
void clearOnTabSelectedListeners();
// Layout behavior
void setTabMode(int mode);
int getTabMode();
void setTabGravity(int gravity);
int getTabGravity();
// Styling
void setSelectedTabIndicatorColor(@ColorInt int color);
void setSelectedTabIndicatorHeight(int height);
void setTabTextColors(@ColorInt int normalColor, @ColorInt int selectedColor);
void setTabTextColors(ColorStateList textColor);
ColorStateList getTabTextColors();
void setTabIconTint(ColorStateList iconTint);
void setTabIconTintResource(@ColorRes int iconTintResourceId);
ColorStateList getTabIconTint();
void setTabRippleColor(ColorStateList color);
void setTabRippleColorResource(@ColorRes int tabRippleColorResourceId);
ColorStateList getTabRippleColor();
void setUnboundedRipple(boolean unboundedRipple);
boolean getUnboundedRipple();
}
class TabLayout.Tab {
CharSequence getText();
Tab setText(CharSequence text);
Tab setText(@StringRes int resId);
Drawable getIcon();
Tab setIcon(Drawable icon);
Tab setIcon(@DrawableRes int resId);
int getPosition();
void select();
boolean isSelected();
Tab setTag(Object tag);
Object getTag();
Tab setCustomView(View view);
Tab setCustomView(@LayoutRes int layoutResId);
View getCustomView();
BadgeDrawable getOrCreateBadge();
BadgeDrawable getBadge();
void removeBadge();
}
interface TabLayout.OnTabSelectedListener {
void onTabSelected(TabLayout.Tab tab);
void onTabUnselected(TabLayout.Tab tab);
void onTabReselected(TabLayout.Tab tab);
}public static final int MODE_SCROLLABLE = 0;
public static final int MODE_FIXED = 1;
public static final int MODE_AUTO = 2;
public static final int GRAVITY_FILL = 0;
public static final int GRAVITY_CENTER = 1;
public static final int GRAVITY_START = 8388611;TabLayout tabLayout = findViewById(R.id.tab_layout);
ViewPager2 viewPager = findViewById(R.id.view_pager);
// Setup tabs manually
String[] tabTitles = {"Home", "Search", "Profile"};
for (String title : tabTitles) {
TabLayout.Tab tab = tabLayout.newTab();
tab.setText(title);
tabLayout.addTab(tab);
}
// Configure appearance
tabLayout.setTabMode(TabLayout.MODE_FIXED);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
// Handle tab selection
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
// Handle tab selection
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {}
@Override
public void onTabReselected(TabLayout.Tab tab) {}
});Links TabLayout with ViewPager2 for synchronized tab and page navigation.
class TabLayoutMediator {
TabLayoutMediator(TabLayout tabLayout, ViewPager2 viewPager, TabConfigurationStrategy tabConfigurationStrategy);
TabLayoutMediator(TabLayout tabLayout, ViewPager2 viewPager, boolean autoRefresh, TabConfigurationStrategy tabConfigurationStrategy);
// Lifecycle
void attach();
void detach();
boolean isAttached();
}
interface TabLayoutMediator.TabConfigurationStrategy {
void onConfigureTab(@NonNull TabLayout.Tab tab, int position);
}TabLayout tabLayout = findViewById(R.id.tab_layout);
ViewPager2 viewPager = findViewById(R.id.view_pager);
// Setup ViewPager with adapter
MyPagerAdapter adapter = new MyPagerAdapter(this);
viewPager.setAdapter(adapter);
// Link TabLayout with ViewPager2
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
switch (position) {
case 0:
tab.setText("Home");
tab.setIcon(R.drawable.ic_home);
break;
case 1:
tab.setText("Search");
tab.setIcon(R.drawable.ic_search);
break;
case 2:
tab.setText("Profile");
tab.setIcon(R.drawable.ic_person);
break;
}
}).attach();Vertical LinearLayout implementing scrolling behaviors for Material app bars.
class AppBarLayout extends LinearLayout {
AppBarLayout(Context context);
AppBarLayout(Context context, AttributeSet attrs);
// Offset listeners
void addOnOffsetChangedListener(OnOffsetChangedListener listener);
void removeOnOffsetChangedListener(OnOffsetChangedListener listener);
// Scroll behavior
int getTotalScrollRange();
void setExpanded(boolean expanded);
void setExpanded(boolean expanded, boolean animate);
// Lift state
boolean isLifted();
void setLifted(boolean lifted);
void setLiftOnScroll(boolean liftOnScroll);
boolean isLiftOnScroll();
}
interface AppBarLayout.OnOffsetChangedListener {
void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset);
}
class AppBarLayout.LayoutParams extends LinearLayout.LayoutParams {
AppBarLayout.LayoutParams(Context c, AttributeSet attrs);
AppBarLayout.LayoutParams(int width, int height);
AppBarLayout.LayoutParams(int width, int height, float weight);
AppBarLayout.LayoutParams(ViewGroup.LayoutParams p);
AppBarLayout.LayoutParams(MarginLayoutParams source);
AppBarLayout.LayoutParams(LinearLayout.LayoutParams source);
void setScrollFlags(int flags);
int getScrollFlags();
void setScrollInterpolator(Interpolator interpolator);
Interpolator getScrollInterpolator();
}public static final int SCROLL_FLAG_SCROLL = 0x1;
public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 0x2;
public static final int SCROLL_FLAG_ENTER_ALWAYS = 0x4;
public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 0x8;
public static final int SCROLL_FLAG_SNAP = 0x10;
public static final int SCROLL_FLAG_SNAP_MARGINS = 0x20;AppBarLayout appBarLayout = findViewById(R.id.app_bar_layout);
// Listen for scroll changes
appBarLayout.addOnOffsetChangedListener((appBarLayout1, verticalOffset) -> {
float alpha = 1.0f - Math.abs(verticalOffset) / (float) appBarLayout1.getTotalScrollRange();
// Update UI based on scroll offset
});
// Control expanded state
appBarLayout.setExpanded(true, true);
// Configure lift on scroll
appBarLayout.setLiftOnScroll(true);Wrapper for Toolbar implementing a collapsing app bar effect.
class CollapsingToolbarLayout extends FrameLayout {
CollapsingToolbarLayout(Context context);
CollapsingToolbarLayout(Context context, AttributeSet attrs);
// Title
void setTitle(CharSequence title);
CharSequence getTitle();
// Scrim drawables
void setContentScrim(Drawable drawable);
Drawable getContentScrim();
void setStatusBarScrim(Drawable drawable);
Drawable getStatusBarScrim();
// Title text appearance
void setCollapsedTitleTextAppearance(@StyleRes int resId);
void setExpandedTitleTextAppearance(@StyleRes int resId);
// Title colors
void setCollapsedTitleTextColor(@ColorInt int color);
void setExpandedTitleTextColor(@ColorInt int color);
void setCollapsedTitleTextColor(ColorStateList colors);
void setExpandedTitleTextColor(ColorStateList colors);
// Title margins
void setExpandedTitleMargin(int start, int top, int end, int bottom);
void setExpandedTitleMarginStart(int margin);
int getExpandedTitleMarginStart();
void setExpandedTitleMarginTop(int margin);
int getExpandedTitleMarginTop();
void setExpandedTitleMarginEnd(int margin);
int getExpandedTitleMarginEnd();
void setExpandedTitleMarginBottom(int margin);
int getExpandedTitleMarginBottom();
// Parallax
void setTitleCollapseMode(int titleCollapseMode);
int getTitleCollapseMode();
}CollapsingToolbarLayout collapsingToolbar = findViewById(R.id.collapsing_toolbar);
Toolbar toolbar = findViewById(R.id.toolbar);
// Setup with ActionBar
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Configure collapsing toolbar
collapsingToolbar.setTitle("Article Title");
collapsingToolbar.setContentScrim(ContextCompat.getDrawable(this, R.color.primary));
collapsingToolbar.setStatusBarScrim(ContextCompat.getDrawable(this, R.color.primary_dark));Material Design themed toolbar with enhanced styling support.
class MaterialToolbar extends Toolbar {
MaterialToolbar(Context context);
MaterialToolbar(Context context, AttributeSet attrs);
// Navigation icon
void setNavigationIcon(Drawable drawable);
void setNavigationIconTint(@ColorInt int color);
Integer getNavigationIconTint();
}MaterialToolbar toolbar = findViewById(R.id.toolbar);
// Setup as ActionBar
setSupportActionBar(toolbar);
// Configure navigation
toolbar.setNavigationIcon(R.drawable.ic_menu);
toolbar.setNavigationIconTint(Color.WHITE);
toolbar.setNavigationOnClickListener(v -> {
// Handle navigation click (e.g., open drawer)
});
// Set title and subtitle
toolbar.setTitle("App Name");
toolbar.setSubtitle("Current Section");Material Design bottom app bar with FAB integration.
class BottomAppBar extends Toolbar {
BottomAppBar(Context context);
BottomAppBar(Context context, AttributeSet attrs);
// FAB alignment
void setFabAlignmentMode(int mode);
int getFabAlignmentMode();
// FAB animation
void setFabAnimationMode(int mode);
int getFabAnimationMode();
// Hide on scroll
void setHideOnScroll(boolean hideOnScroll);
boolean getHideOnScroll();
// FAB cradle configuration
void setCradleVerticalOffset(float verticalOffset);
float getCradleVerticalOffset();
void setFabCradleMargin(float margin);
float getFabCradleMargin();
void setFabCradleRoundedCornerRadius(float radius);
float getFabCradleRoundedCornerRadius();
}public static final int FAB_ALIGNMENT_MODE_CENTER = 0;
public static final int FAB_ALIGNMENT_MODE_END = 1;
public static final int FAB_ANIMATION_MODE_SCALE = 0;
public static final int FAB_ANIMATION_MODE_SLIDE = 1;BottomAppBar bottomAppBar = findViewById(R.id.bottom_app_bar);
FloatingActionButton fab = findViewById(R.id.fab);
// Configure FAB alignment
bottomAppBar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_CENTER);
bottomAppBar.setFabAnimationMode(BottomAppBar.FAB_ANIMATION_MODE_SLIDE);
// Configure cradle
bottomAppBar.setFabCradleMargin(16f);
bottomAppBar.setFabCradleRoundedCornerRadius(8f);
// Handle menu clicks
bottomAppBar.setOnMenuItemClickListener(item -> {
switch (item.getItemId()) {
case R.id.menu_search:
// Handle search
return true;
case R.id.menu_more:
// Handle more options
return true;
default:
return false;
}
});
// Animate FAB alignment
bottomAppBar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_END);Base class for bottom navigation and navigation rail with common functionality.
abstract class NavigationBarView extends FrameLayout {
// Item selection
void setOnItemSelectedListener(OnItemSelectedListener listener);
void setOnItemReselectedListener(OnItemReselectedListener listener);
// Menu and selection
Menu getMenu();
void setSelectedItemId(@IdRes int itemId);
int getSelectedItemId();
// Badges
void setBadgeFor(@IdRes int menuItemId, BadgeDrawable badgeDrawable);
BadgeDrawable getOrCreateBadge(@IdRes int menuItemId);
BadgeDrawable getBadge(@IdRes int menuItemId);
void removeBadge(@IdRes int menuItemId);
// Item styling
void setItemIconTintList(ColorStateList tint);
ColorStateList getItemIconTintList();
void setItemTextColor(ColorStateList textColor);
ColorStateList getItemTextColor();
void setItemIconSize(@Dimension int size);
int getItemIconSize();
void setItemIconSizeRes(@DimenRes int sizeRes);
void setItemTextAppearanceInactive(@StyleRes int textAppearanceRes);
int getItemTextAppearanceInactive();
void setItemTextAppearanceActive(@StyleRes int textAppearanceRes);
int getItemTextAppearanceActive();
void setItemBackgroundResource(@DrawableRes int backgroundRes);
void setItemBackground(Drawable background);
Drawable getItemBackground();
// Label visibility
void setLabelVisibilityMode(int mode);
int getLabelVisibilityMode();
}
interface NavigationBarView.OnItemSelectedListener {
boolean onNavigationItemSelected(@NonNull MenuItem item);
}
interface NavigationBarView.OnItemReselectedListener {
void onNavigationItemReselected(@NonNull MenuItem item);
}public static final int LABEL_VISIBILITY_AUTO = -1;
public static final int LABEL_VISIBILITY_SELECTED = 0;
public static final int LABEL_VISIBILITY_LABELED = 1;
public static final int LABEL_VISIBILITY_UNLABELED = 2;A floating search field with affordances for search and navigation functionality.
public class SearchBar extends Toolbar {
public SearchBar(Context context);
public SearchBar(Context context, AttributeSet attrs);
// Text content
public void setText(@Nullable CharSequence text);
public void setText(@StringRes int textResId);
public CharSequence getText();
public void clearText();
// Hint text
public void setHint(@Nullable CharSequence hint);
public void setHint(@StringRes int hintResId);
public CharSequence getHint();
// Text alignment
public void setTextCentered(boolean textCentered);
public boolean getTextCentered();
// Navigation
public void setNavigationOnClickListener(OnClickListener listener);
public void setNavigationIcon(@Nullable Drawable navigationIcon);
public void setNavigationIcon(@DrawableRes int navigationIconRes);
// Menu inflation
public void inflateMenu(@MenuRes int resId);
// Lift on scroll behavior
public void setLiftOnScroll(boolean liftOnScroll);
public boolean isLiftOnScroll();
// Center view
public void setCenterView(@Nullable View view);
public View getCenterView();
}A full-screen search interface that works together with SearchBar for rich search experiences.
public class SearchView extends FrameLayout {
public SearchView(Context context);
public SearchView(Context context, AttributeSet attrs);
// Search bar setup
public void setupWithSearchBar(@Nullable SearchBar searchBar);
// Text content
public void setText(@Nullable CharSequence text);
public void setText(@StringRes int textResId);
public CharSequence getText();
public void clearText();
// Hint text
public void setHint(@Nullable CharSequence hint);
public void setHint(@StringRes int hintResId);
public CharSequence getHint();
// Visibility and animation
public void show();
public void hide();
public boolean isShowing();
// Status bar color
public void setStatusBarSpacerColor(@ColorInt int color);
public int getStatusBarSpacerColor();
public void setStatusBarSpacerEnabled(boolean enabled);
public boolean isStatusBarSpacerEnabled();
// Menu setup
public void inflateMenu(@MenuRes int menuResId);
public void setOnMenuItemClickListener(@Nullable OnMenuItemClickListener listener);
// Listeners
public void addTransitionListener(@NonNull TransitionListener transitionListener);
public void removeTransitionListener(@NonNull TransitionListener transitionListener);
public interface TransitionListener {
void onStateChanged(@NonNull SearchView searchView, @NonNull TransitionState previousState, @NonNull TransitionState newState);
}
public enum TransitionState {
HIDING, HIDDEN, SHOWING, SHOWN
}
}Usage Example:
// Setup SearchBar
SearchBar searchBar = findViewById(R.id.search_bar);
searchBar.setHint("Search products...");
searchBar.setNavigationOnClickListener(v -> {
// Handle navigation click
});
// Setup SearchView
SearchView searchView = findViewById(R.id.search_view);
searchView.setupWithSearchBar(searchBar);
searchView.inflateMenu(R.menu.search_menu);
// Add search functionality
EditText searchEditText = searchView.findViewById(R.id.search_edit_text);
searchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
performSearch(s.toString());
}
// ... other TextWatcher methods
});Install with Tessl CLI
npx tessl i tessl/maven-com-google-android-material--material