Android toggle buttons group

Hands-on with Material Components for Android: Buttons

Part 4 of a series covering practical usage of Material Components for Android

This post will be covering the features and API of Button components. To find out how to handle initial setup of Material Components for Android (including the Gradle dependency and creating an app theme), please see my original post:

Setting up a Material Components theme for Android

Attribute by attribute

Buttons are arguably the most widely-used components in any app. This is largely due to their versatility, allowing users to perform actions and make choices that ultimately guide the flow of an experience. A single line of contained text and/or an icon indicate the action a button can perform.

Material Buttons are slightly different to traditional Android buttons in that they do not include additional insets (4dp on the left/right) and have more letter-spacing, different default colors and other attributes that improve legibility and affordance amongst other components.

From a design perspective, there are three main types of buttons which are intended to offer hierarchical levels of emphasis:

  • Text button (low emphasis): No container. Best used for less important actions, especially when other main content needs to be emphasised.

In addition to this, buttons can be grouped together into a fourth type: Toggle button. This allows related button actions to be horizontally arranged in a common container. The buttons themselves can be selected/deselected to indicate an active/inactive choice.

Basic usage 🏁

A MaterialButton can be included in your layout like so:

Choosing a style 🤔

As discussed in the intro section above, a variety of button types exist. These types map to styles that you can apply to a MaterialButton . There also exists a variety of sub-styles for specific use cases, such as to adjust padding for an icon. The full list of styles and their attributes can be found on GitHub. These style variants inherit from Widget.MaterialComponents.Button , each with an optional style suffix:

  • Text button: *.TextButton (main), *.TextButton.Icon , *.TextButton.Snackbar , *.TextButton.Dialog , *.TextButton.Dialog.Icon , *.TextButton.Dialog.Flush
  • Outlined button: *.OutlinedButton (main), *.OutlinedButton.Icon
  • Contained button (unelevated): *.UnelevatedButton (main), *.UnelevatedButton.Icon
  • Contained button (raised): No suffix (default, main), *.Icon

Adding an icon 🔷

An icon can be added to a button. It is displayed at the start, before the text label. In order to get the correct icon padding, it is recommended that you use a *.Icon style variant (shown above in the “Choosing a style” section).

The icon can be added in XML:

Alternatively, it can be done programmatically:

A few additional attributes exist for adjusting the icon size and position:

  • iconSize : The width/height of the icon. The default value is the supplied Drawable ’s intrinsic width.

  • iconGravity : The gravity of the icon. This can be set to start ( ICON_GRAVITY_START , default, at start of button), end ( ICON_GRAVITY_END , at end of button), textStart ( ICON_GRAVITY_TEXT_START , at start of centered text label) or textEnd ( ICON_GRAVITY_TEXT_END , at end of centered text label).
Читайте также:  Android oreo go edition что это

  • iconPadding : The spacing between the icon and the text label. Typically you would not want to change this. The default value is 4dp for text buttons and 8dp for all other types.

Attributes related to icon tinting are discussed in the “Theming” section below.

Grouping Buttons to create a Toggle Button 👨‍👩‍👧‍👦

In order to create a toggle button, we need to add MaterialButton s as child View s to a MaterialButtonToggleGroup (a custom ViewGroup ).

Note: MaterialButtonToggleGroup was added in the 1.1.0-alpha05 release of Material Components for Android.

Grouping

This can be done in XML:

Alternatively, it can be done programmatically:

The MaterialButtonToggleGroup handles layout and adjusting of only the relevant shape corners in the row of MaterialButton s. The appearance of the MaterialButton s is determined by whichever style they each use. It is advised to use a consistent style for all children and also recommended to use the outlined button type.

Adjusting selected behavior

When added to a MaterialButtonToggleGroup , child MaterialButton s automatically become “selectable” (i.e. The android:checkable attribute is set to true).

Thus, there exists a couple of attributes for adjusting how MaterialButtonToggleGroup manages this:

  • singleSelection : Determines whether or not only a single button in the group can be checked at a time. The default value is false, meaning multiple buttons can be checked/unchecked independently.

Listening for selection state

We are able to query for and adjust the current checked button(s) in a variety of ways:

We are also able to listen for checked changes by adding an OnButtonCheckedListener to a MaterialButtonToggleGroup :

Listeners can also be removed with the MaterialButtonToggleGroup#removeListener and MaterialButtonToggleGroup#clearListeners functions.

Orientation

The default arrangement of buttons within a toggle group is horizontal. However, seeing as MaterialButtonToggleGroup extends LinearLayout , it also supports vertical arrangement. This can be set programmatically or in XML:

The interesting thing to note here is the extra attributes on the child MaterialButton (s). It is recommended to set the width to match_parent and to remove the top/bottom insets from the child buttons so as to have them sit flush against each other vertically. This also, however, requires adjusting the minHeight to make up for the lack of insets.

Theming 🎨

Buttons can be themed in terms of the three Material Theming subsystems: color, typography and shape. We have already shown which styles to use in the “Choosing a style” section above. When implementing a global custom MaterialButton and MaterialButtonToggleGroup styles, reference them in your app theme with the materialButtonStyle / materialButtonOutlinedStyle and materialButtonToggleGroupStyle attributes respectively.

Color

The color of the MaterialButton background can be customized with the backgroundTint attribute. This requires a ColorStateList , meaning a for checked/enabled/disabled states is required. It defaults to colorPrimary (enabled)/ colorOnSurface (disabled) for contained buttons and transparent(unchecked)/ colorPrimary (checked) for all other types, with different opacities per state. There is also a backgroundTintMode attribute to change the tint PorterDuff.Mode , although typically you would want to keep this the same.

The color of the text label can be customized with the android:textColor attribute. This too requires a ColorStateList . It defaults to colorOnPrimary (enabled)/ colorOnSurface (disabled) for contained buttons and colorPrimary (enabled or checked)/ colorOnSurface (disabled or unchecked) for all other types, with different opacities per state.

The color of the optional icon can be customized with the iconTint attribute. This too requires a ColorStateList and the defaults are the same as those of android:textColor . As before, there is also an iconTintMode attribute.

Читайте также:  Не могу установить кэш для андроида

Lastly, the color of the button touch ripple can be customized with the rippleColor attribute. It too accepts a ColorStateList and defaults to colorOnPrimary for contained buttons and colorPrimary for all other types, with different opacities per state.

Typography

The button text label will adopt the fontFamily attribute defined in your app theme.

While you would typically want to keep most aspects of the button text appearance as is, the Material Guidelines suggest we can use sentence case over the standard all caps for the text label, if desired. To achieve this, we would create a new style:

We could apply this directly to a button or in an individual button style by referencing it with the android:textAppearance attribute. Alternatively, it can be applied globally by referencing it in your app theme with the textAppearanceButton attribute.

Shape

The shape of a button background can be customized with the shapeAppearance attribute. This defaults to shapeAppearanceSmallComponent .

While not strictly shape theming, it is worth mentioning that the width of an outlined button stroke can be adjusted with the strokeWidth attribute. This defaults to 1dp.

More resources 📚

  • The source code for the Playground app used in this article can be found on GitHub.
  • Buttons Design Documentation
  • Buttons API Documentation
  • Toggle Buttons API Documentation

I hope this post has provided some insight into Material Buttons and how they can be used in your Android app(s). If you have any questions, thoughts or suggestions then I’d love to hear from you!

Источник

Android toggle buttons group

Customisable toggle buttons inside a FlexboxLayout.

ThemedToggleButtonGroup is a highly modular lightweight toggle button library for Android. It can be configured for single selection or multi selection. For multi selection the minimum/maximum amount of buttons that are required/enabled can be specified. Icon’s can be added. Selection includes a fun press and circular reveal animation.

The main class ThemedToggleButtonGroup.kt extends Google’s FlexboxLayout. Allowing you to use styling similar to CSS Flexbox for the button’s inside the toggle group.

As of version 1.3.2 hosting will be moved from Bintray to MavenCentral. I will move all versions to mavenCentral, but to be safe please use the latest version of this library.

Add the dependency in your app’s build.gradle file:

For Java projects you also have to add implementation ‘org.jetbrains.kotlin:kotlin-stdlib:1.6.0’

Declare how many buttons may be selected with toggle_selectableAmount .
Declare how many buttons must be selected with toggle_requiredAmount .

CIRCULAR_REVEAL FADE HORIZONTAL_SLIDE
VERTICAL_SLIDE HORIZONTAL_WINDOW VERTICAL_WINDOW

To set the animation on your layout add this to the toggle group: app:toggle_selectAnimation=»circular_reveal» . You can also set the animation programmatically:

It is possible to add icons to the buttons and show a different icon when the button is selected. This example also shows how to add borders.

Text + icon selection

A demo for this example can be found here: demo-toggle-cards. You need to use SVG icons to allow the color to be altered.

The easiest way to react to selection changes is to use group.setOnSelectListener(() -> <>) .

Once a button is selected its property isSelected will be set to true.

Programmatically adding buttons

A demo project for this can be found here: programmatically-add-buttons.
Programmatically create a ThemedToggleButtonGroup :

Select/deselect a button programmatically: You can pass in the ThemedButton itself or its resId. This will toggle selection. Fire the method a second time to deselect the button.

These lists include all custom attributes from this library. Please take a look FlexboxLayout to see all custom attributes that can also be applied to these Views.

ThemedToggleButtonGroup custom attributes

Attribute Default value Description
app:toggle_selectableAmount 1 The amount of buttons that are allowed to be selected. If the user tries to select more buttons, the button that was last selected will be deselected.
app:toggle_requiredAmount 1 The amount of buttons that are required to be selected. If the user tries to deselect a button below the required amount, the selection is blocked. You can programmatically specify which buttons should be selected initially by setting ThemedButton.isSelected . Otherwise a random button will be selected initially.
app:toggle_horizontalSpacing 10dp The amount of space between the buttons when they are positioned next to each other.
app:toggle_selectAnimation SelectAnimation.CIRCULAR_REVEAL The type of animations that occur upon selecting a button. Some animations require a certain API level. If the API level is not met SelectAnimation.FADE is used instead.

ThemedButton custom attributes

You can fully customise colors, positioning, font size, etc. with these attributes.

Attribute Default value Description
app:toggle_text Empty string Text of the button.
app:toggle_selectedText app:toggle_text Text when the button is selected. If not present the text of toggle_text is used.
app:toggle_textSize 15sp Size of the text in the button.
app:toggle_textAlignment center Alignment of the text. (API 17+)
app:toggle_fontFamily Roboto (Android default) The font of the text. Put your font file in /src/main/assets . And enter the the rest of the path here. For example if your font is in: /src/main/assets/fonts/arial.ttf enter this in your layout: app:toggle_fontFamily=»/fonts/arial.ttf»
app:toggle_backgroundColor #EBEBEB Background color when the button is not selected.
app:toggle_selectedBackgroundColor #5E6FED Background color when the button is selected.
app:toggle_textColor #5E5E5E Text color when the button is not selected. This also sets the color of the icon if it is not set.
app:toggle_selectedTextColor #FFFFFF Text color when the button is selected. This also sets the color of the selected icon if it is not set.
app:toggle_icon null Optional icon inside the button.
app:toggle_selectedIcon app:toggle_icon Icon when the button is selected. By default the icon of app:toggle_icon is used.
app:toggle_iconColor #5E5E5E Color of the icon when the button is not selected.
app:toggle_btnCornerRadius 21dp Curve amount of the button’s corners.
app:toggle_circularCornerRadius false This makes the button circular. This overrides the corner radius.
app:toggle_borderWidth 0dp The width of the border.
app:toggle_selectedBorderWidth app:toggle_borderWidth The width of the border when the button is selected. By default the width of toggle_borderWidth is used.
app:toggle_borderColor #5E5E5E The color of the border.
app:toggle_selectedBorderColor app:toggle_borderColor The color of the border when the button is selected.. By default the color of app:toggle_borderColor is used.
app:toggle_padding 0dp Padding of the button.
app:toggle_textPadding 14dp (horizontal) Padding of the text.
app:toggle_iconPadding 0dp Padding of the icon.
app:toggle_iconGravity top|start Position of the icon.
app:toggle_textGravity top|start Position of the text.

You can contribute by opening an issue or forking this repository and creating a pull request.

Источник

Читайте также:  Spec device для андроид
Оцените статью