Views DSL Material¶
Material Components extension of Views DSL
Supported platforms: Android.
Setup¶
If you want to use this dependency without using one of the fun packs,
you can use Splitties.viewsDslMaterial, provided you have refreshVersions added to the project.
For reference, the maven coordinates of this module are com.louiscad.splitties:splitties-views-dsl-material.
Table of contents¶
- Functions to instantiate Views and ViewGroups from Material Components
- Use Material Components xml styles in a typesafe way
- Extensions on ViewGroups from Material Components
- Bottom sheet behavior extensions
- TextInputLayout helper
Functions to instantiate Views and ViewGroups from Material Components¶
Instead of using view(::AppBarLayout) { … } and similar, you can use appBarLayout(…) { … }.
All widgets from Material Components are supported.
To see the list, check the implementations for Views and ViewGroups.
Note that there two bonuses in this split:
* When calling appBarLayout(…) { … }, you get an implementation that fixes a
scrolling bug from Material Components where first click is ignored.
* When calling collapsingToolbarLayout(…) { … }, you get an implementation that
handles config changes.
Multi-process apps¶
If your app needs to use Material themed widgets in the non default process, you'll need to manually setup ViewFactory, so it uses Material Components.
Here's how you need to do it:
1. Copy and paste
this Initializer into a package of an android library/app module of your project
2. Create an internal subclass of androidx.startup.InitializationProvider
4. Declare that subclass in the
AndroidManifest.xml of the module exactly like it is done here. To do so, copy and paste it, then fix the package of the class under the android:name xml attribute
of the provider tag, specify the android:process value to the one of your non default
process, and finally changed the android:name xml attribute of the meta-data tag to the initializer you copied in the first step.
Be sure to test it to make sure you have set it up properly.
Use Material Components xml styles in a typesafe way¶
Since Material Components styles are not included by default inside the theme, you need to load them first. This is simply done with the following code:
private val materialStyles = MaterialComponentsStyles(ctx)
You can then use styles using the MaterialComponentsStyles instance. Here's an example:
val bePoliteBtn = materialStyles.button.outlined {
textResource = R.string.be_polite
}
Styles are supported for BottomAppBar, BottomNavigationView, MaterialButton, Chip, TabLayout and TextInputLayout.
Extensions on ViewGroups from Material Components¶
AppBarLayout extensions¶
defaultLParams¶
This extension function has a default width of matchParent
and a default height of wrapContent so you don't have to specify them in
most of the cases.
It also has a scrollFlags parameter which defaults to ENTER_ALWAYS, same
as when inflated from an xml layout.
Use it when you add a View to an AppBarLayout.
Values for scrollFlags¶
SCROLL, EXIT_UNTIL_COLLAPSED, ENTER_ALWAYS, ENTER_ALWAYS_COLLAPSED
and SNAP are extension properties on AppBarLayout that are meant to be
used as flags (using or if you use multiple ones) with the scrollFlags
parameter of the defaultLParams function mentioned above. They are
provided for your convenience so they appear in autocomplete when relevant.
CollapsingToolbarLayout extensions¶
defaultLParams¶
As for AppBarLayout, this extension function has a default width of
matchParent and a default height of wrapContent so you don't have to
specify them in most of the cases.
It also has two optional parameters:
- collapseMode, which defaults to COLLAPSE_MODE_OFF
- parallaxMultiplier, which defaults to 0.5f (default value as of 27.1.1)
Use it when you add a View to a CollapsingToolbarLayout.
actionBarLParams¶
Similar to defaultLParams, but the height is R.attr.actionBarSize
instead of wrapContent. Use it when adding a Toolbar.
Values for collapseMode¶
PIN and PARALLAX are extension properties on CollapsingToolbarLayout
that are meant to be used for the collapseMode parameter of the
defaultLParams and actionBarLParams functions mentioned above. They are
provided for your convenience so they appear in autocomplete when relevant.
CoordinatorLayout extensions¶
More in Views DSL CoordinatorLayout¶
This split has a transitive dependency on Views DSL CoordinatorLayout which includes coordinatorLayout instantiating function, as well as layout params
functions like defaultLParams, appBarLParams, and anchorTo.
contentScrollingWithAppBarLParams()¶
If your CoordinatorLayout has an AppbarLayout and scrolling content
(e.g. a RecyclerView),
use this method to add the scrolling content View. It sets an
AppBarLayout.ScrollingViewBehavior under the hood.
This function accepts an optional config lambda.
Bottom sheet behavior extensions¶
bottomSheetBehavior¶
This extension function on Ui that takes an optional initialization lambda
creates a BottomSheetBehavior to use on CoordinatorLayout.LayoutParams.
Bottom sheet state extensions¶
This split also includes extensions on BottomSheetBehavior:
* hidden and expanded: read-write extension properties.
* hide() and expand(): extension functions.
They make playing with your bottom sheets programmatically a breeze. See their KDoc to see their exact behavior.
TextInputLayout helper¶
The addInput extension function on TextInputLayout takes a required id
used for the TextInputEditText that it creates and adds to the layout.
The id is required so the content of the user input is saved in instance state even if the host Activity is killed by the system.