Google's official Material Design components library for Android applications with comprehensive UI components, theming, and animations.
—
Text input components, sliders, and form-related elements for collecting and validating user input with Material Design styling and behavior patterns.
A layout that wraps EditText components to provide Material Design styling, floating labels, helper text, and error handling.
public class TextInputLayout extends LinearLayout {
public TextInputLayout(Context context);
public TextInputLayout(Context context, AttributeSet attrs);
// Hint management
public void setHint(CharSequence hint);
public CharSequence getHint();
public void setHintEnabled(boolean enabled);
public boolean isHintEnabled();
public void setHintAnimationEnabled(boolean enabled);
public boolean isHintAnimationEnabled();
public void setHintTextAppearance(@StyleRes int resId);
public void setHintTextColor(ColorStateList hintTextColor);
public ColorStateList getHintTextColor();
// Helper text
public void setHelperText(CharSequence helperText);
public CharSequence getHelperText();
public void setHelperTextEnabled(boolean enabled);
public boolean isHelperTextEnabled();
public void setHelperTextTextAppearance(@StyleRes int resId);
public void setHelperTextColor(ColorStateList helperTextColor);
public ColorStateList getHelperTextColor();
// Error handling
public void setError(CharSequence error);
public CharSequence getError();
public void setErrorEnabled(boolean enabled);
public boolean isErrorEnabled();
public void setErrorTextAppearance(@StyleRes int resId);
public void setErrorTextColor(ColorStateList errorTextColor);
public ColorStateList getErrorTextColor();
public void setErrorIconDrawable(@DrawableRes int resId);
public void setErrorIconDrawable(Drawable errorIcon);
public Drawable getErrorIconDrawable();
public void setErrorIconTintList(ColorStateList errorIconTintList);
public ColorStateList getErrorIconTintList();
// Character counter
public void setCounterEnabled(boolean enabled);
public boolean isCounterEnabled();
public void setCounterMaxLength(int maxLength);
public int getCounterMaxLength();
public void setCounterTextAppearance(int counterTextAppearance);
public void setCounterTextColor(ColorStateList counterTextColor);
public ColorStateList getCounterTextColor();
public void setCounterOverflowTextAppearance(int counterOverflowTextAppearance);
public void setCounterOverflowTextColor(ColorStateList counterOverflowTextColor);
public ColorStateList getCounterOverflowTextColor();
// Start icon
public void setStartIconDrawable(@DrawableRes int resId);
public void setStartIconDrawable(Drawable startIcon);
public Drawable getStartIconDrawable();
public void setStartIconContentDescription(@StringRes int resId);
public void setStartIconContentDescription(CharSequence startIconContentDescription);
public CharSequence getStartIconContentDescription();
public void setStartIconOnClickListener(View.OnClickListener startIconOnClickListener);
public void setStartIconOnLongClickListener(View.OnLongClickListener startIconOnLongClickListener);
public void setStartIconVisible(boolean visible);
public boolean isStartIconVisible();
public void setStartIconTintList(ColorStateList startIconTintList);
public ColorStateList getStartIconTintList();
public void setStartIconTintMode(PorterDuff.Mode startIconTintMode);
public PorterDuff.Mode getStartIconTintMode();
// End icon
public void setEndIconMode(int endIconMode);
public int getEndIconMode();
public void setEndIconDrawable(@DrawableRes int resId);
public void setEndIconDrawable(Drawable endIcon);
public Drawable getEndIconDrawable();
public void setEndIconContentDescription(@StringRes int resId);
public void setEndIconContentDescription(CharSequence endIconContentDescription);
public CharSequence getEndIconContentDescription();
public void setEndIconOnClickListener(View.OnClickListener endIconOnClickListener);
public void setEndIconOnLongClickListener(View.OnLongClickListener endIconOnLongClickListener);
public void setEndIconVisible(boolean visible);
public boolean isEndIconVisible();
public void setEndIconTintList(ColorStateList endIconTintList);
public ColorStateList getEndIconTintList();
public void setEndIconTintMode(PorterDuff.Mode endIconTintMode);
public PorterDuff.Mode getEndIconTintMode();
public void setEndIconActivated(boolean endIconActivated);
public boolean isEndIconActivated();
// Prefix and suffix text
public void setPrefixText(CharSequence prefixText);
public CharSequence getPrefixText();
public void setPrefixTextAppearance(@StyleRes int prefixTextAppearance);
public void setPrefixTextColor(ColorStateList prefixTextColor);
public ColorStateList getPrefixTextColor();
public TextView getPrefixTextView();
public void setSuffixText(CharSequence suffixText);
public CharSequence getSuffixText();
public void setSuffixTextAppearance(@StyleRes int suffixTextAppearance);
public void setSuffixTextColor(ColorStateList suffixTextColor);
public ColorStateList getSuffixTextColor();
public TextView getSuffixTextView();
// Placeholder text
public void setPlaceholderText(CharSequence placeholderText);
public CharSequence getPlaceholderText();
public void setPlaceholderTextAppearance(@StyleRes int placeholderTextAppearance);
public void setPlaceholderTextColor(ColorStateList placeholderTextColor);
public ColorStateList getPlaceholderTextColor();
// EditText access
public EditText getEditText();
// Shape appearance
public void setShapeAppearanceModel(ShapeAppearanceModel shapeAppearanceModel);
public ShapeAppearanceModel getShapeAppearanceModel();
// Listeners
public void addOnEndIconChangedListener(OnEndIconChangedListener listener);
public void removeOnEndIconChangedListener(OnEndIconChangedListener listener);
public void clearOnEndIconChangedListeners();
public void addOnEditTextAttachedListener(OnEditTextAttachedListener listener);
public void removeOnEditTextAttachedListener(OnEditTextAttachedListener listener);
public void clearOnEditTextAttachedListeners();
public interface OnEndIconChangedListener {
void onEndIconChanged(TextInputLayout textInputLayout, int previousIcon);
}
public interface OnEditTextAttachedListener {
void onEditTextAttached(TextInputLayout textInputLayout);
}
}End Icon Mode Constants:
public static final int END_ICON_NONE = 0;
public static final int END_ICON_PASSWORD_TOGGLE = 1;
public static final int END_ICON_CLEAR_TEXT = 2;
public static final int END_ICON_DROPDOWN_MENU = 3;
public static final int END_ICON_CUSTOM = -1;A specialized EditText designed for use with TextInputLayout.
public class TextInputEditText extends AppCompatEditText {
public TextInputEditText(Context context);
public TextInputEditText(Context context, AttributeSet attrs);
public CharSequence getHint();
public TextInputLayout getTextInputLayout();
}An AutoCompleteTextView with Material Design styling for dropdown selections.
public class MaterialAutoCompleteTextView extends AppCompatAutoCompleteTextView {
public MaterialAutoCompleteTextView(Context context);
public MaterialAutoCompleteTextView(Context context, AttributeSet attrs);
public void setAdapter(ListAdapter adapter);
public ListAdapter getAdapter();
public void setSimpleItems(@ArrayRes int arrayResId);
public void setSimpleItems(String[] items);
}A Material Design slider for selecting values from a continuous or discrete range.
public class Slider extends BaseSlider<Slider, Slider.OnChangeListener, Slider.OnSliderTouchListener> {
public Slider(Context context);
public Slider(Context context, AttributeSet attrs);
// Value management
public float getValue();
public void setValue(float value);
public void setValueFrom(float valueFrom);
public float getValueFrom();
public void setValueTo(float valueTo);
public float getValueTo();
public void setStepSize(float stepSize);
public float getStepSize();
// Focus management
public void setFocusedThumbIndex(int index);
public int getFocusedThumbIndex();
// Listeners
public void addOnChangeListener(OnChangeListener listener);
public void removeOnChangeListener(OnChangeListener listener);
public void clearOnChangeListeners();
public void addOnSliderTouchListener(OnSliderTouchListener listener);
public void removeOnSliderTouchListener(OnSliderTouchListener listener);
public void clearOnSliderTouchListeners();
// Label formatting
public boolean hasLabelFormatter();
public void setLabelFormatter(LabelFormatter formatter);
// Thumb customization
public void setCustomThumbDrawable(@DrawableRes int drawableResId);
public void setCustomThumbDrawable(Drawable drawable);
public void setCustomThumbDrawablesForValues(@DrawableRes int... customThumbDrawableResIds);
public void setCustomThumbDrawablesForValues(Drawable... customThumbDrawables);
// Appearance
public void setThumbRadius(@IntRange(from = 0) int radius);
public void setThumbRadiusResource(@DimenRes int radius);
public int getThumbRadius();
public void setHaloRadius(@IntRange(from = 0) int radius);
public void setHaloRadiusResource(@DimenRes int radius);
public int getHaloRadius();
public void setThumbElevation(float elevation);
public void setThumbElevationResource(@DimenRes int elevation);
public float getThumbElevation();
public void setTrackHeight(@IntRange(from = 0) int height);
public void setTrackHeightResource(@DimenRes int height);
public int getTrackHeight();
public interface OnChangeListener {
void onValueChange(Slider slider, float value, boolean fromUser);
}
public interface OnSliderTouchListener {
void onStartTrackingTouch(Slider slider);
void onStopTrackingTouch(Slider slider);
}
public interface LabelFormatter {
String getFormattedValue(float value);
}
}A slider that allows selection of a range of values.
public class RangeSlider extends BaseSlider<RangeSlider, RangeSlider.OnChangeListener, RangeSlider.OnSliderTouchListener> {
public RangeSlider(Context context);
public RangeSlider(Context context, AttributeSet attrs);
// Value management
public List<Float> getValues();
public void setValues(Float... values);
public void setValues(List<Float> values);
public void setMinSeparation(float minSeparation);
public float getMinSeparation();
public void setMinSeparationValue(float minSeparationValue);
public float getMinSeparationValue();
public interface OnChangeListener {
void onValueChange(RangeSlider slider, float value, boolean fromUser);
}
public interface OnSliderTouchListener {
void onStartTrackingTouch(RangeSlider slider);
void onStopTrackingTouch(RangeSlider slider);
}
}A TextView with Material Design theming support.
public class MaterialTextView extends AppCompatTextView {
public MaterialTextView(Context context);
public MaterialTextView(Context context, AttributeSet attrs);
public void setTextAppearance(@StyleRes int resId);
public void setLineHeight(@Px int lineHeight);
public int getLineHeight();
}TextInputLayout textInputLayout = new TextInputLayout(context);
textInputLayout.setHint("Email Address");
textInputLayout.setHelperText("We'll never share your email");
textInputLayout.setEndIconMode(TextInputLayout.END_ICON_CLEAR_TEXT);
textInputLayout.setCounterEnabled(true);
textInputLayout.setCounterMaxLength(50);
TextInputEditText editText = new TextInputEditText(textInputLayout.getContext());
textInputLayout.addView(editText);
// Add validation
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
String email = s.toString();
if (!isValidEmail(email)) {
textInputLayout.setError("Please enter a valid email address");
} else {
textInputLayout.setError(null);
}
}
});TextInputLayout passwordInputLayout = new TextInputLayout(context);
passwordInputLayout.setHint("Password");
passwordInputLayout.setEndIconMode(TextInputLayout.END_ICON_PASSWORD_TOGGLE);
passwordInputLayout.setHelperText("Must be at least 8 characters");
TextInputEditText passwordEditText = new TextInputEditText(passwordInputLayout.getContext());
passwordEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
passwordInputLayout.addView(passwordEditText);MaterialAutoCompleteTextView autoCompleteTextView = new MaterialAutoCompleteTextView(context);
String[] countries = {"United States", "Canada", "Mexico", "United Kingdom", "France", "Germany"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, countries);
autoCompleteTextView.setAdapter(adapter);
TextInputLayout dropdownLayout = new TextInputLayout(context);
dropdownLayout.setHint("Select Country");
dropdownLayout.setEndIconMode(TextInputLayout.END_ICON_DROPDOWN_MENU);
dropdownLayout.addView(autoCompleteTextView);Slider volumeSlider = new Slider(context);
volumeSlider.setValueFrom(0f);
volumeSlider.setValueTo(100f);
volumeSlider.setValue(50f);
volumeSlider.setStepSize(1f);
volumeSlider.setLabelFormatter(value -> (int) value + "%");
volumeSlider.addOnChangeListener((slider, value, fromUser) -> {
if (fromUser) {
setVolume((int) value);
}
});
volumeSlider.addOnSliderTouchListener(new Slider.OnSliderTouchListener() {
@Override
public void onStartTrackingTouch(Slider slider) {
// User started dragging
}
@Override
public void onStopTrackingTouch(Slider slider) {
// User stopped dragging
saveVolumePreference((int) slider.getValue());
}
});RangeSlider priceRangeSlider = new RangeSlider(context);
priceRangeSlider.setValueFrom(0f);
priceRangeSlider.setValueTo(1000f);
priceRangeSlider.setValues(100f, 500f);
priceRangeSlider.setStepSize(10f);
priceRangeSlider.setMinSeparation(50f);
priceRangeSlider.setLabelFormatter(value -> "$" + (int) value);
priceRangeSlider.addOnChangeListener((slider, value, fromUser) -> {
if (fromUser) {
List<Float> values = slider.getValues();
float minPrice = values.get(0);
float maxPrice = values.get(1);
filterProductsByPrice(minPrice, maxPrice);
}
});LinearLayout formLayout = new LinearLayout(context);
formLayout.setOrientation(LinearLayout.VERTICAL);
// Name input
TextInputLayout nameInputLayout = new TextInputLayout(context);
nameInputLayout.setHint("Full Name");
nameInputLayout.setStartIconDrawable(R.drawable.ic_person);
TextInputEditText nameEditText = new TextInputEditText(nameInputLayout.getContext());
nameInputLayout.addView(nameEditText);
// Email input
TextInputLayout emailInputLayout = new TextInputLayout(context);
emailInputLayout.setHint("Email Address");
emailInputLayout.setStartIconDrawable(R.drawable.ic_email);
emailInputLayout.setEndIconMode(TextInputLayout.END_ICON_CLEAR_TEXT);
TextInputEditText emailEditText = new TextInputEditText(emailInputLayout.getContext());
emailEditText.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
emailInputLayout.addView(emailEditText);
// Phone input
TextInputLayout phoneInputLayout = new TextInputLayout(context);
phoneInputLayout.setHint("Phone Number");
phoneInputLayout.setStartIconDrawable(R.drawable.ic_phone);
phoneInputLayout.setPrefixText("+1 ");
TextInputEditText phoneEditText = new TextInputEditText(phoneInputLayout.getContext());
phoneEditText.setInputType(InputType.TYPE_CLASS_PHONE);
phoneInputLayout.addView(phoneEditText);
formLayout.addView(nameInputLayout);
formLayout.addView(emailInputLayout);
formLayout.addView(phoneInputLayout);Install with Tessl CLI
npx tessl i tessl/maven-com-google-android-material--material