Google's official Material Design components library for Android applications with comprehensive UI components, theming, and animations.
—
Core input controls including buttons, chips, checkboxes, radio buttons, and switches with Material Design styling and behavior. These components provide consistent interaction patterns following Material Design principles.
A Material Design button with extensive customization options including icons, stroke styling, and corner radius.
public class MaterialButton extends AppCompatButton {
public MaterialButton(Context context);
public MaterialButton(Context context, AttributeSet attrs);
// Icon management
public void setIcon(Drawable icon);
public Drawable getIcon();
public void setIconTint(ColorStateList iconTint);
public ColorStateList getIconTint();
public void setIconSize(int iconSize);
public int getIconSize();
public void setIconGravity(int iconGravity);
public int getIconGravity();
// Stroke and corners
public void setStrokeColor(ColorStateList strokeColor);
public ColorStateList getStrokeColor();
public void setStrokeWidth(int strokeWidth);
public int getStrokeWidth();
public void setCornerRadius(int cornerRadius);
public int getCornerRadius();
// Ripple effect
public void setRippleColor(ColorStateList rippleColor);
public ColorStateList getRippleColor();
// Checkable behavior
public void setCheckable(boolean checkable);
public boolean isCheckable();
public void setChecked(boolean checked);
public boolean isChecked();
public void toggle();
// Listeners
public void addOnCheckedChangeListener(OnCheckedChangeListener listener);
public void removeOnCheckedChangeListener(OnCheckedChangeListener listener);
public interface OnCheckedChangeListener {
void onCheckedChanged(MaterialButton button, boolean isChecked);
}
}Usage Example:
MaterialButton button = new MaterialButton(context);
button.setText("Save");
button.setIcon(ContextCompat.getDrawable(context, R.drawable.ic_save));
button.setIconGravity(MaterialButton.ICON_GRAVITY_TEXT_START);
button.setStrokeColor(ColorStateList.valueOf(Color.BLUE));
button.setStrokeWidth(2);
button.setCornerRadius(8);
button.setOnClickListener(v -> saveData());A container for grouping related MaterialButtons with single or multiple selection support.
public class MaterialButtonToggleGroup extends LinearLayout {
public MaterialButtonToggleGroup(Context context);
public MaterialButtonToggleGroup(Context context, AttributeSet attrs);
// Selection management
public void check(@IdRes int id);
public void uncheck(@IdRes int id);
public void clearChecked();
public int getCheckedButtonId();
public List<Integer> getCheckedButtonIds();
// Selection behavior
public void setSingleSelection(boolean singleSelection);
public boolean isSingleSelection();
public void setSelectionRequired(boolean selectionRequired);
public boolean isSelectionRequired();
// Listeners
public void addOnButtonCheckedListener(OnButtonCheckedListener listener);
public void removeOnButtonCheckedListener(OnButtonCheckedListener listener);
public interface OnButtonCheckedListener {
void onButtonChecked(MaterialButtonToggleGroup group, @IdRes int checkedId, boolean isChecked);
}
}A specialized container for creating split buttons with a main action and a secondary dropdown action.
public class MaterialSplitButton extends MaterialButtonGroup {
public MaterialSplitButton(Context context);
public MaterialSplitButton(Context context, AttributeSet attrs);
// Inherited from MaterialButtonGroup
public void addView(View child, int index, ViewGroup.LayoutParams params);
public void setChildrenDrawingOrderEnabled(boolean enabled);
public boolean isChildrenDrawingOrderEnabled();
// Layout and appearance inherited from parent classes
public void setOrientation(int orientation);
public int getOrientation();
}Usage Example:
MaterialSplitButton splitButton = new MaterialSplitButton(context);
// Main action button
MaterialButton mainButton = new MaterialButton(context);
mainButton.setText("Save");
mainButton.setIcon(ContextCompat.getDrawable(context, R.drawable.ic_save));
mainButton.setOnClickListener(v -> saveDocument());
// Dropdown button
MaterialButton dropdownButton = new MaterialButton(context);
dropdownButton.setIcon(ContextCompat.getDrawable(context, R.drawable.ic_arrow_drop_down));
dropdownButton.setOnClickListener(v -> showSaveOptions());
splitButton.addView(mainButton);
splitButton.addView(dropdownButton);A circular button that performs primary actions in an application.
public class FloatingActionButton extends VisibilityAwareImageButton implements ExpandableWidget {
public FloatingActionButton(Context context);
public FloatingActionButton(Context context, AttributeSet attrs);
// Size management
public void setSize(int size);
public int getSize();
// Image and tint
public void setSupportImageTintList(ColorStateList tint);
public ColorStateList getSupportImageTintList();
public void setSupportImageTintMode(PorterDuff.Mode tintMode);
public PorterDuff.Mode getSupportImageTintMode();
// Background
public void setBackgroundTintList(ColorStateList tint);
public ColorStateList getBackgroundTintList();
public void setBackgroundTintMode(PorterDuff.Mode tintMode);
public PorterDuff.Mode getBackgroundTintMode();
// Ripple effect
public void setRippleColor(@ColorInt int color);
public void setRippleColor(ColorStateList rippleColor);
public ColorStateList getRippleColor();
// Visibility animations
public void show();
public void show(OnVisibilityChangedListener listener);
public void hide();
public void hide(OnVisibilityChangedListener listener);
// Expandable behavior
public boolean setExpanded(boolean expanded);
public boolean isExpanded();
// Elevation
public void setCompatElevation(float elevation);
public float getCompatElevation();
public void setCompatHoveredFocusedTranslationZ(float translationZ);
public float getCompatHoveredFocusedTranslationZ();
public void setCompatPressedTranslationZ(float translationZ);
public float getCompatPressedTranslationZ();
public abstract static class OnVisibilityChangedListener {
public void onShown(FloatingActionButton fab);
public void onHidden(FloatingActionButton fab);
}
}Constants:
public static final int SIZE_MINI = 1;
public static final int SIZE_NORMAL = 0;
public static final int SIZE_AUTO = -1;An extended FAB with both icon and text.
public class ExtendedFloatingActionButton extends MaterialButton implements ExpandableWidget {
public ExtendedFloatingActionButton(Context context);
public ExtendedFloatingActionButton(Context context, AttributeSet attrs);
// Text and icon
public void setText(CharSequence text);
public CharSequence getText();
public void setIcon(Drawable icon);
public Drawable getIcon();
public void setIconTint(ColorStateList iconTint);
public ColorStateList getIconTint();
// Extended state
public void extend();
public void extend(OnChangedCallback callback);
public void shrink();
public void shrink(OnChangedCallback callback);
public boolean isExtended();
public void setExtended(boolean extended);
// Visibility
public void show();
public void show(OnChangedCallback callback);
public void hide();
public void hide(OnChangedCallback callback);
public abstract static class OnChangedCallback {
public void onShown(ExtendedFloatingActionButton extendedFab);
public void onHidden(ExtendedFloatingActionButton extendedFab);
public void onExtended(ExtendedFloatingActionButton extendedFab);
public void onShrunken(ExtendedFloatingActionButton extendedFab);
}
}A compact element representing an input, attribute, or action.
public class Chip extends AppCompatCheckBox implements ChipDrawable.Delegate {
public Chip(Context context);
public Chip(Context context, AttributeSet attrs);
// Text
public void setText(CharSequence text);
public CharSequence getText();
// Chip icon
public void setChipIcon(Drawable chipIcon);
public Drawable getChipIcon();
public void setChipIconTint(ColorStateList chipIconTint);
public ColorStateList getChipIconTint();
public void setChipIconSize(float chipIconSize);
public float getChipIconSize();
// Close icon
public void setCloseIcon(Drawable closeIcon);
public Drawable getCloseIcon();
public void setCloseIconTint(ColorStateList closeIconTint);
public ColorStateList getCloseIconTint();
public void setCloseIconSize(float closeIconSize);
public float getCloseIconSize();
public void setOnCloseIconClickListener(View.OnClickListener listener);
public View.OnClickListener getOnCloseIconClickListener();
// Appearance
public void setChipBackgroundColor(ColorStateList chipBackgroundColor);
public ColorStateList getChipBackgroundColor();
public void setChipStrokeColor(ColorStateList chipStrokeColor);
public ColorStateList getChipStrokeColor();
public void setChipStrokeWidth(float chipStrokeWidth);
public float getChipStrokeWidth();
public void setChipCornerRadius(float chipCornerRadius);
public float getChipCornerRadius();
public void setChipMinHeight(float chipMinHeight);
public float getChipMinHeight();
// Ripple
public void setRippleColor(ColorStateList rippleColor);
public ColorStateList getRippleColor();
// Checkable behavior
public void setCheckable(boolean checkable);
public boolean isCheckable();
public void setChecked(boolean checked);
public boolean isChecked();
}A container for a set of chips with single or multiple selection.
public class ChipGroup extends ViewGroup {
public ChipGroup(Context context);
public ChipGroup(Context context, AttributeSet attrs);
// Spacing
public void setChipSpacing(int chipSpacing);
public void setChipSpacingHorizontal(int chipSpacingHorizontal);
public void setChipSpacingVertical(int chipSpacingVertical);
public int getChipSpacing();
public int getChipSpacingHorizontal();
public int getChipSpacingVertical();
// Layout
public void setSingleLine(boolean singleLine);
public boolean isSingleLine();
// Selection
public void setSingleSelection(boolean singleSelection);
public void setSingleSelection(@BoolRes int id);
public boolean isSingleSelection();
public void setSelectionRequired(boolean selectionRequired);
public boolean isSelectionRequired();
// Selection management
public void check(@IdRes int id);
public void uncheck(@IdRes int id);
public void clearCheck();
public int getCheckedChipId();
public List<Integer> getCheckedChipIds();
// Listeners
public void setOnCheckedChangeListener(OnCheckedChangeListener listener);
public interface OnCheckedChangeListener {
void onCheckedChanged(ChipGroup group, @IdRes int checkedId);
}
}A Material Design themed CheckBox.
public class MaterialCheckBox extends AppCompatCheckBox {
public MaterialCheckBox(Context context);
public MaterialCheckBox(Context context, AttributeSet attrs);
// Material theming
public void setUseMaterialThemeColors(boolean useMaterialThemeColors);
public boolean isUseMaterialThemeColors();
// Button tint
public void setButtonTintList(ColorStateList tint);
public ColorStateList getButtonTintList();
// Center positioning
public void setCenterIfNoTextEnabled(boolean centerIfNoTextEnabled);
public boolean isCenterIfNoTextEnabled();
}A Material Design themed RadioButton.
public class MaterialRadioButton extends AppCompatRadioButton {
public MaterialRadioButton(Context context);
public MaterialRadioButton(Context context, AttributeSet attrs);
// Material theming
public void setUseMaterialThemeColors(boolean useMaterialThemeColors);
public boolean isUseMaterialThemeColors();
}A Material Design switch component.
public class SwitchMaterial extends SwitchCompat {
public SwitchMaterial(Context context);
public SwitchMaterial(Context context, AttributeSet attrs);
// Material theming
public void setUseMaterialThemeColors(boolean useMaterialThemeColors);
public boolean isUseMaterialThemeColors();
}MaterialButton button = new MaterialButton(context);
button.setText("Download");
button.setIcon(ContextCompat.getDrawable(context, R.drawable.ic_download));
button.setIconGravity(MaterialButton.ICON_GRAVITY_TEXT_START);
button.setStrokeColor(ColorStateList.valueOf(getColor(R.color.primary)));
button.setStrokeWidth(2);
button.setCornerRadius(16);
button.setOnClickListener(v -> startDownload());MaterialButtonToggleGroup toggleGroup = new MaterialButtonToggleGroup(context);
toggleGroup.setSingleSelection(true);
toggleGroup.setSelectionRequired(true);
MaterialButton option1 = new MaterialButton(context);
option1.setText("Option 1");
option1.setId(R.id.option1);
MaterialButton option2 = new MaterialButton(context);
option2.setText("Option 2");
option2.setId(R.id.option2);
toggleGroup.addView(option1);
toggleGroup.addView(option2);
toggleGroup.check(R.id.option1);
toggleGroup.addOnButtonCheckedListener((group, checkedId, isChecked) -> {
if (isChecked) {
handleOptionSelected(checkedId);
}
});ChipGroup chipGroup = new ChipGroup(context);
chipGroup.setSingleSelection(false);
String[] filters = {"All", "Active", "Completed", "Archived"};
for (String filter : filters) {
Chip chip = new Chip(context);
chip.setText(filter);
chip.setCheckable(true);
chip.setChipIcon(ContextCompat.getDrawable(context, R.drawable.ic_filter));
chipGroup.addView(chip);
}
chipGroup.setOnCheckedChangeListener((group, checkedId) -> {
List<Integer> checkedIds = group.getCheckedChipIds();
applyFilters(checkedIds);
});// MaterialButton icon gravity
public static final int ICON_GRAVITY_START = 1;
public static final int ICON_GRAVITY_TEXT_START = 2;
public static final int ICON_GRAVITY_END = 3;
public static final int ICON_GRAVITY_TEXT_END = 4;
public static final int ICON_GRAVITY_TOP = 16;
public static final int ICON_GRAVITY_TEXT_TOP = 32;
// FloatingActionButton sizes
public static final int SIZE_MINI = 1;
public static final int SIZE_NORMAL = 0;
public static final int SIZE_AUTO = -1;Install with Tessl CLI
npx tessl i tessl/maven-com-google-android-material--material