Last active
March 10, 2025 08:53
-
Star
(142)
You must be signed in to star a gist -
Fork
(20)
You must be signed in to fork a gist
-
-
Save ArthurNagy/1c4a64e6c8a7ddfca58638a9453e4aed to your computer and use it in GitHub Desktop.
Rounded modal bottom sheet as seen in new Google products(Tasks, News, etc.), described in this article: https://medium.com/halcyon-mobile/implementing-googles-refreshed-modal-bottom-sheet-4e76cb5de65b
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- Drawable used for the bottom sheet dialog background --> | |
<?xml version="1.0" encoding="utf-8"?> | |
<shape xmlns:android="http://schemas.android.com/apk/res/android" | |
android:shape="rectangle"> | |
<corners | |
android:topLeftRadius="@dimen/bottom_sheet_corner_radius" | |
android:topRightRadius="@dimen/bottom_sheet_corner_radius" /> | |
<padding android:top="@dimen/bottom_sheet_top_padding" /> | |
<solid android:color="@color/primary" /> | |
</shape> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<dimen name="bottom_sheet_corner_radius">16dp</dimen> | |
<dimen name="bottom_sheet_top_padding">8dp</dimen> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.your.package | |
import android.app.Dialog | |
import android.os.Bundle | |
import com.your.package.R | |
import com.google.android.material.bottomsheet.BottomSheetDialog | |
import com.google.android.material.bottomsheet.BottomSheetDialogFragment | |
/** | |
* BottomSheetDialog fragment that uses a custom | |
* theme which sets a rounded background to the dialog | |
* and doesn't dim the navigation bar | |
*/ | |
open class RoundedBottomSheetDialogFragment : BottomSheetDialogFragment() { | |
override fun getTheme(): Int = R.style.BottomSheetDialogTheme | |
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = BottomSheetDialog(requireContext(), theme) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- v21 styles, you can merge these two if your minSdkVersion is >= 21 --> | |
<resources> | |
<style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog"> | |
<item name="android:statusBarColor">@android:color/transparent</item> | |
<item name="android:navigationBarColor">@color/white</item> | |
</style> | |
</resources> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<resources> | |
<!-- set the rounded drawable as background to your bottom sheet --> | |
<style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal"> | |
<item name="android:background">@drawable/bg_bottom_sheet_dialog_fragment</item> | |
</style> | |
<style name="BaseBottomSheetDialog" parent="@style/Theme.Design.Light.BottomSheetDialog"> | |
<item name="android:windowIsFloating">false</item> | |
<item name="bottomSheetStyle">@style/BottomSheet</item> | |
</style> | |
<style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" /> | |
</resources> |
add full source code! :(
Just like this with the new API
<!-- Stuff to make the bottom sheet with round top borders -->
<style name="BottomSheetShapeAppearance" parent="ShapeAppearance.MaterialComponents.LargeComponent">
<item name="cornerFamily">rounded</item>
<item name="cornerSizeTopLeft">12dp</item>
<item name="cornerSizeTopRight">12dp</item>
</style>
<style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
<item name="shapeAppearance">@style/BottomSheetShapeAppearance</item>
</style>
<style name="BaseBottomSheetMenu" parent="@style/Theme.Design.Light.BottomSheetDialog">
<item name="android:windowIsFloating">false</item>
<item name="bottomSheetStyle">@style/BottomSheet</item>
</style>
<style name="BottomSheetMenuTheme" parent="@style/BaseBottomSheetMenu" />
Change background opacity as you scroll the dialog:
open class RoundedBottomSheetDialogFragment : BottomSheetDialogFragment() { override fun getTheme(): Int = R.style.BottomSheetDialogTheme override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = BottomSheetDialog(requireContext(), theme) dialog.setOnShowListener { dialog.behavior.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { if (newState == BottomSheetBehavior.STATE_HIDDEN) { dialog.dismiss() } } override fun onSlide(bottomSheet: View, slideOffset: Float) { if(!slideOffset.isNaN()) dialog.window?.setDimAmount(0.5f - ((slideOffset * -1)/2)) } }) } return dialog } }
setBottomSheetCallback
is now deprecated, you can use addBottomSheetCallback
now
Hi there,
you guys can read this article and take advantage of a modern way to do this.
Hi there,
you guys can read this article and take advantage of a modern way to do this.
Hey! I appreciate your modern implementation recommendation, but if you read the article linked at the top of the gist you'll see that the solution you are proposing is referenced in the article as well since the article was written before the introduction of shapeAppearances
from MaterialComponents.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey @cakfan! As I mentioned in my article, there's no reason to use this implementation with MaterialComponents since there is an easier solution using ShapeTheming.