- Android Bottom Sheet / Bottom Sheet Behavior
- Hands-on with Material Components for Android: Bottom Sheets
- Part 3 of a series covering practical usage of Material Components for Android
- Setting up a Material Components theme for Android
- Attribute by attribute
- Basic usage 🏁
- Standard Bottom Sheet
- Modal Bottom Sheet
- Adjusting behavior ⚙️
- Applying attributes
- The attributes
- A word on modal dismiss animations
- Setting (and saving) state 💾
- Setting state
- Retaining attribute state on configuration change
- Listening for state change and slide callbacks 👂
- Theming 🎨
- Color
- Typography
- Shape
- More resources 📚
- Implementing Bottom Sheet Dialogs using Android Studio
- Types of the Bottom Sheet dialogs
- Modal Bottom Sheet dialog
- Persistent Bottom Sheet dialog
- Implementation
- Implementing a Modal Bottom Sheet dialog
- Preparing layouts
- Initializing the Bottom Sheet in the activity
- Set onClick Listener
- Testing the application
- Implementing a Persistent Bottom Sheet dialog
- Laying out the Bottom Sheet design
- Expanding and collapsing the sheet dialog
- Run the application
- Conclusion
- About the author
- Want to learn more about the EngEd Program?
Android Bottom Sheet / Bottom Sheet Behavior
Jan 2, 2019 · 4 min read
Android Bottom Sheet is a component that slides up from the bottom of the screen having multiple options. Here are the examples of the Bottom sheet from apps.
There are two types of bottom sheets, Persistent Bottom Sheet and Modal Bottom Sheet.
Persistent Bottom Sheet: This bottom sheet shows in-application content. It will be shown at the base of the screen with a portion of its part noticeable (we can characterize measurements in dp), it shows full substance in the wake of growing it. It has a littler height.
Modal Bottom Sheet: This botom sheet functions as a menu or discourse with choices, it implies this replaces menu or exchange. It has a higher height than the determined base sheet. For the most part, they are utilized for incorporating profound connecting picker activities.
Let’s start to implement the first persistent bottom sheet.
After creating a new project, open build.gradle file in app level, add support design dependency because the bottom sheet is the component of the android design support library.
Create bottom_sheet.xml layout:
Create conent_main.xml layout, that displays on-screen without the bottom sheet.
Now crea t e activity_main.xml including content and bottom sheet layout.
Now code in MainActivity.java
Now lets a look at Modal bottom sheet, the easiest way for the bottom sheet. Modal bottom sheet will be shown as an external dialog using BottomSheetDialog or BottomSheetDialogFragment.
As component we are using (BottomSheetDialog or BottomSheetDialogFragment)is a dialog itself. So its behavior is same as normal dialog, that you can touch outside to dismiss bottom sheet using this method.
We will show the bottom sheet dialog with the same UI that we used before.
That’s it. Now you have learnt the implementation of the bottom sheet. Find code her
Источник
Hands-on with Material Components for Android: Bottom Sheets
Part 3 of a series covering practical usage of Material Components for Android
This post will be covering the features and API of Bottom Sheet 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
Bottom Sheets are surface components that hold supplementary screen content. They are anchored to the bottom of a screen (making them ergonomic on mobile/tablet devices) and, similar to Dialogs, are elevated over main screen content. In most cases, they can be expanded/dismissed via a drag up/down gesture.
From a design perspective, there are two types of Bottom Sheets:
- Standard Bottom Sheet: They operate independently to (and allow for simultaneous interaction with) primary screen content. They can be in an expanded, collapsed or hidden state.
- Modal Bottom Sheet: They block primary screen content and must be interacted with or dismissed. A semi-transparent scrim, which can be tapped to dismiss, is displayed behind them to indicate the underlying UI is temporarily inaccessible.
Note: A third type exists: Expanding Bottom Sheet . At the time of writing, the latest release of Material Components for Android is 1.2.0-alpha06 and there is no standard component or class to handle this. A custom implementation could be achieved with something like MotionLayout , but that is outside the scope of this article and won’t be covered.
Basic usage 🏁
Implementing Bottom Sheets is not as simple as using a single component. There exists different classes within Material Components for Android for each type of sheet.
Standard Bottom Sheet
A child View of a CoordinatorLayout can have Standard Bottom Sheet characteristics enabled by using BottomSheetBehavior . In doing so, the bottom anchoring, drag up/down gesture support and animated state transitions and more are handled for us.
This can be done in your screen layout like so:
In the above example, our Bottom Sheet is in fact the FrameLayout . The most important part is that the layout_behavior attribute is set to com.google.android.material.bottomsheet.BottomSheetBehavior . We have also applied some default styling (background shape/tint, elevation, etc.) with the bottomSheetStyle attribute, which will be discussed in more detail below in the “Theming” section.
Modal Bottom Sheet
For Modal Bottom Sheets, the implementation is different. The BottomSheetDialogFragment class (which extends AppCompatDialogFragment ) provides the desired modal behavior in addition to existing DialogFragment functionality.
First of all, a subclass of BottomSheetDialogFragment needs to be created and the onViewCreated callback must be overridden to provide a layout for the contents of the sheet:
Then, inside an AppCompatActivity , the class can be used to show the sheet like so:
It is worth noting that, under the hood, BottomSheetDialogFragment also makes use of BottomSheetBehavior in a BottomSheetDialog class to convert a standard AppCompatDialogFragment to one that has Bottom Sheet characteristics. BottomSheetDialog can be used independently if you don’t want to use a Fragment .
Adjusting behavior ⚙️
There exists a variety of attributes that can be used to adjust the behavior of both Standard and Modal Bottom Sheets. This includes things like “peek” (collapsed) height, hidability, content fitting and more.
Applying attributes
For Standard Bottom Sheets, applying these attributes can be done in XML by applying the attributes to the same child View that has the layout_behavior attribute set to BottomSheetBehavior . In our example above in the “Basic usage” section, this is the FrameLayout .
Alternatively, it can be done programmatically:
For Modal Bottom Sheets there is no XML layout definition for the sheet itself, but we can make use of app-level theme attributes and styles:
Alternatively, it can be done programmatically:
The attributes
Now that we know how to apply attributes, let’s dive into what attributes are available to us.
- behavior_hideable : Determines whether or not the sheet can be hidden when using a drag down gesture (bearing in mind that it can always be hidden programmatically). The default value is false for Standard Bottom Sheets and true for Modal Bottom Sheets.
- behavior_draggable : Determines whether or not the sheet can be collapsed/expanded when using a drag gesture (bearing in mind that a custom way to expand/collapse the sheet will need to be implemented). The default value is true.
- behavior_skipCollapsed : Determines whether or not the collapsed state should be ignored when hiding the sheet. This has no effect if behavior_hideable is not set to true. The default value is false.
- behavior_fitToContents : Determines whether or not the height of the expanded sheet wraps its contents. Alternatively, it expands in two stages: half the height of the parent container, full height of the parent container. The default value is true.
- behavior_halfExpandedRatio : Determines the height of the sheet (as a ratio of the parent container height) when in half-expanded state. This has no effect if behavior_fitToContents is not set to false and should be greater than the peek height. The default value is 0.5 (the recommended ratio in the Material Guidelines).
- behavior_expandedOffset : Determines the offset of the sheet from the top of the parent container when in expanded state. This has no effect if behavior_fitToContents is not set to false and should be greater than the offset when in half-expanded state. The default value is 0dp (the top of the sheet matches the top of the parent container).
- behavior_peekHeight : The initial “peek” (collapsed state) height of the sheet. The default value is auto , which sets the peek height at the 16:9 ratio keyline of the parent container. A dimension (or pixel value, programmatically) can otherwise be used.
A word on modal dismiss animations
You might notice that, for modal bottom sheets (i.e. BottomSheetDialog or BottomSheetDialogFragment ), the animation used when calling dismiss() does not match the normal drag-to-dismiss animation. As of Material Components for Android 1.1.0-alpha10 , there exists an opt-in flag to align these animations:
Setting (and saving) state 💾
The state of a Bottom Sheet can be changed via user interaction, but we can also do so programmatically. By default, these state changes are animated.
Setting state
The following states can be set on a BottomSheetBehavior :
- STATE_EXPANDED : The sheet is fully expanded.
- STATE_COLLAPSED : The sheet is collapsed (“peeking”).
- STATE_HIDDEN : The sheet is hidden and can only be re-shown programmatically.
- STATE_HALF_EXPANDED : The sheet is half-expanded (only applicable if behavior_fitToContents has been set to false).
This can be done like so:
While these should not be set programmatically, a BottomSheetBehavior can also be in one of the following states:
- STATE_DRAGGING : The sheet is being dragged up/down via a gesture.
- STATE_SETTLING : The sheet is animating up/down as a result of programmatically setting its state.
Retaining attribute state on configuration change
We can choose which aspects of state we wish to preserve when the host Activity experiences a configuration change (i.e. the View representing our Bottom Sheet is destroyed and recreated). In this case, “state” refers to the attributes discussed in the “Adjusting behavior” section above.
The following flags can be set (or combined with bitwise OR operations) on a BottomSheetBehavior :
- SAVE_PEEK_HEIGHT : The behavior_peekHeight attribute will be preserved.
- SAVE_FIT_TO_CONTENTS : The behavior_fitToContents attribute will be preserved.
- SAVE_HIDEABLE : The behavior_hideable attribute will be preserved.
- SAVE_SKIP_COLLAPSED : The behavior_skipCollapsed attribute will be preserved.
- SAVE_ALL : All aforementioned attributes will be preserved.
- SAVE_NONE : No attributes will be preserved. This is the default value.
This can be done like so:
There is also a corresponding behavior_saveFlags XML attribute which can be used in layouts and styles.
Listening for state change and slide callbacks 👂
We can listen for changes to Bottom Sheet state as well as the current slide offset. This can be used to coordinate other UI changes, such as fading in/out other View s, adjusting system bar color, etc.
A BottomSheetCallback can be added to a BottomSheetBehavior like so:
In the onStateChanged callback, the newState parameter will be one of the state constants discussed above in the “Setting (and saving) state” section.
In the onSlide callback, the slideOffset parameter is a Float value in the [-1.0, 1.0] range. Hidden state is -1.0, collapsed state is 0.0 and expanded state is 1.0. The value interpolates linearly and increases as the sheet moves upwards.
Note: Multiple callbacks can be added (and removed via BottomSheetBehavior#removeBottomSheetCallback ).
Theming 🎨
Bottom Sheets can be themed in terms of the three Material Theming subsystems: color, typography and shape. For Standard Bottom Sheets, there are no existing style variants but we can create our own. When implementing a global Standard Bottom Sheet style, reference it in your app theme with the bottomSheetStyle attribute. For Modal Bottom Sheets, we have already shown which styles/attributes to use in the “Adjusting behavior” section above. Theming attributes are applicable to both sheet types.
Color
The color of a Bottom Sheet background can be customized with the backgroundTint attribute. This defaults to colorSurface .
Typography
There is no primary text as part of Bottom Sheet components. Text included in the contents of a Bottom Sheet will be styled according to the class/component used as well as the fontFamily app theme attribute.
Shape
The shape of a Bottom Sheet background can be customized with the shapeAppearance attribute. This defaults to shapeAppearanceLargeComponent .
More resources 📚
- The source code for the Playground app used in this article can be found on GitHub.
- Bottom Sheets Design Documentation
- Bottom Sheet API Documentation
- Modal Bottom Sheet API Documentation
I hope this post has provided some insight into Bottom Sheets 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!
Источник
Implementing Bottom Sheet Dialogs using Android Studio
February 19, 2021
Bottom Sheet dialogs seem to be replacing regular Android dialogs and menus. The Bottom Sheet is a component that slides up from the bottom of the screen to showcase additional content in your application.
A Bottom Sheet dialog is like a message box triggered by the user’s actions. Companies such as Google, Facebook, and Twitter have implemented this feature in their applications.
Bottom Sheet dialogs are used in music, payment, and file management applications. In terms of application, any Android view including TextView , ImageView , RecyclerViews , Buttons , and Text inputs can be included in a Bottom Sheet. This makes it quite dynamic.
For instance, it can help display data retrieved from a database. A Bottom Sheet can be applied in many instances as long as it fits your application cycle.
Types of the Bottom Sheet dialogs
The two main types of Bottom Sheets are Modal and Persistent dialogs;
Modal Bottom Sheet dialog
It has similar characteristics as an Alert dialog. When triggered (by the user’s action), it slides up from the bottom of the current screen. A Modal Sheet can contain a list of items.
These elements can correspond to some action when clicked. The Modal Bottom Sheet blocks interaction with the rest of the screen to indicate a shift of focus. It is dismissed when the user clicks outside the view or on back press.
Instead of wrapping the Modal Bottom Sheet with the CoordinatorLayout like the persistent dialog, we create it dynamically, just like a regular dialog.
An excellent example of a Modal Bottom Sheet dialog is the Google Drive application.
Or this payment Bottom Sheet dialog example.
.
Modal Bottom Sheets are an excellent alternative to inline menus and simple dialogs. They provide additional room for more content, iconography, and more screen actions.
Persistent Bottom Sheet dialog
Persistent Bottom Sheet dialogs provide supplementary content about the current screen. It is as a child of the CoordinatorLayout .
A portion of the container is visible to provide users with more content. Unlike the Modal dialog, a Persistent Bottom Sheet widget is permanent for the current screen content.
Here is an example of a Persistent Bottom Sheet dialog in a Google Maps application.
Implementation
Create a new Android studio project. To implement a Bottom Sheet dialog, you need a material design library.
Include the following library in your app.gradle file.
Sync the project to download the library. This will make all the required functions available in your project.
We will discuss how to implement the two types of Bottom Sheet dialogs using Android studio.
Implementing a Modal Bottom Sheet dialog
Preparing layouts
To show the dialog, you need an XML file that arranges the dialog’s content. You can choose to use any widgets that fit in the dialog. The views can include RecyclerView , ImageViews , Text , Inputs , and Button .
Make sure you generate some vector images as showcased in the ImageView of the below XML file. Or check this GitHub repository for more reference.
Here is the bottom_sheet_dialog_layout.xml layout that I will be using to implement a Modal Bottom Sheet.
A dialog is triggered by a specified user action. In this tutorial, we will include a button and trigger the dialog using it’s onClick Listener.
Go ahead and add a button in your activity_main.xml file.
Initializing the Bottom Sheet in the activity
Initialize the button and set the onClick Listener inside the onCreate function. When the button is clicked, we will show the dialog. Create a function showBottomSheetDialog() and call it inside the button’s onClick Listener, as shown below.
Inside the showBottomSheetDialog() function, initialize the Bottom Sheet dialog. Initialize the bottom_sheet_dialog_layout.xml using the setContentView method.
Declare all the views and call them by id as specified in the Bottom Sheet layout. Finally, we will diplay the dialog using bottomSheetDialog.show() .
Run the app to test if the Bottom Sheet is working. Clicking the button should trigger the dialog to slide from the bottom to the top.
Set onClick Listener
Each element in the dialog layout can be assigned an action. When an item is clicked, it will redirect the user as specified in the code.
In our application, we will show a Toast message when an element is clicked. You can make modifications in your future apps to direct users to different activities.
Add the following OnClickListeners right above bottomSheetDialog.show() .
We use bottomSheetDialog.dismiss() to close the dialog once an element is clicked.
You can also set a more distinct action, instructing your application to do something when the dialog is dismissed. For instance, the app can launch a new activity.
Testing the application
- BottomSheetDialogFragment A fragment can be displayed as a Bottom Sheet dialog. Go ahead and create a new fragment, call it BottomSheetFragment . You can opt to start a new project.
Creating a new fragment will generate an XML file associated with it. Go ahead and include your layout design in it. Use the same layout as specified in bottom_sheet_dialog_layout.xml . Inflate the layout for this fragment, as shown below.
Add a button in the activity_main.xml , declare it, and set OnClick Listener as dicussed in the previous steps.
We want to open the fragment when the button is clicked.
Indicate the following code block inside the button’s OnClick Listener.
We need to convert the fragment to a Bottom Sheet. We do so by extending BottomSheetDialogFragment rather than Fragment .
When you run the application, it should show the dialog shown below.
Check the code used to implement both Modal dialogs on GitHub.
Implementing a Persistent Bottom Sheet dialog
Laying out the Bottom Sheet design
We will use an example of a simple login screen. Instead of showing it within the regular activity layout, we will use a Persistent dialog to slide it into the main screen.
I have created a bottom_sheet_dialog_layout.xml file and included the following simple login layout.
This is not a Bottom Sheet yet. It’s just a regular layout. To transform the layout to a Bottom Sheet dialog, a few declarations should be added to the root layout.
These statements will control the Bottom Sheet’s behaviors. You can learn more about these attributes from here.
The Bottom Sheet behavioral flags include;
app:layout_behavior — applies the BottomSheetBehavior into the XML file. This is assigned to com.google.android.material.bottomsheet . It is the most important BottomSheetBehavior attribute since it defines a given layout as a Bottom Sheet dialog.
app:behavior_hideable — takes a Boolean value. If true , a user can drag and hide the dialog by sliding it down. If false, the dialog will float on the screen and will not be hideable.
app:behavior_peekHeight — it defines the height of the Bottom Sheet visible to the user.
Remember to add an id to be used to access the layout.
For a Bottom Sheet to be implemented effectively, it must be a child of CoordinatorLayout . To do that, go to your main XML file. This could be an Activity or Fragment. In our case, it will be the activity_main.xml .
Here is the code to do that.
Remember to include the Bottom Sheet we designed. Wrap it with CoordinatorLayout .
Expanding and collapsing the sheet dialog
To control the sliding and collapsing of the dialog, we use states. The Bottom Sheet has several states which you need to understand. They include:
- STATE_EXPANDED — the dialog is visible to its maximum defined height.
- STATE_COLLAPSED — the dialog is visible depending on the set peekHeight .
- STATE_DRAGGING — the user is dragging the dialog up and down.
- STATE_SETTLING — show that the dialog is settling at a specific height. This can be the peekHeight , expanded height, or zero if the dialog is hidden.
- STATE_HIDDEN — the dialog is not visible.
The last thing we will do is listen to the state of the dialog. We use BottomSheetCallback to detect any state changes.
Declare the following parameters:
Initialize the behavior Bottom Sheet layout and the arrow image:
We will assign OnClick Listener to the arrow vector image. When clicked, we want to expand or collapse the dialog.
Implement a BottomSheetCallback to listen to the BottomSheetBehavior state.
onStateChanged tells the application what’s happening on the dialog depending on the state. onSlide will rotate the arrow image (while sliding bottom to top) until the STATE_EXPANDED has reached its maximum height.
On the other side, the image will rotate to its original state when STATE_COLLAPSED is at peekHeight .
Run the application
Check the code used to implement the Persistent dialog on GitHub.
Conclusion
The Bottom Sheet dialog is a unique way to display menus and dialogs. It provides more room to include content. Bottom Sheet dialogs can accomodate different components.
Check out Material documentation to learn more about the Bottom Sheet dialog.
Peer Review Contributions by Wanja Mike
About the author
Joseph Chege is an undergraduate student taking a Bachelor in Business Information Technology, a 4th-year student at Dedan Kimathi University of Technology. Joseph is fluent in Android Mobile Application Development and has a lot of passion for back-end development.
Want to learn more about the EngEd Program?
Discover Section’s community-generated pool of resources from the next generation of engineers.
Источник