{"id":13604246,"url":"https://github.com/arthur3486/bottomsheets","last_synced_at":"2026-01-21T07:15:51.214Z","repository":{"id":89017594,"uuid":"172364974","full_name":"arthur3486/bottomsheets","owner":"arthur3486","description":"Material Bottom Sheets library for Android","archived":false,"fork":false,"pushed_at":"2023-03-05T02:00:16.000Z","size":17526,"stargazers_count":80,"open_issues_count":4,"forks_count":12,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-07T08:42:36.178Z","etag":null,"topics":["android","android-bottomsheet","android-library","android-ui","bottomsheets","java","kotlin","material","material-design","material-ui","ui","view","viewgroup"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arthur3486.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-24T17:03:21.000Z","updated_at":"2024-11-02T22:32:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"f2aa3f7c-ae4f-4898-8583-a8c5397c5012","html_url":"https://github.com/arthur3486/bottomsheets","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur3486%2Fbottomsheets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur3486%2Fbottomsheets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur3486%2Fbottomsheets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arthur3486%2Fbottomsheets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arthur3486","download_url":"https://codeload.github.com/arthur3486/bottomsheets/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248495073,"owners_count":21113565,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-bottomsheet","android-library","android-ui","bottomsheets","java","kotlin","material","material-design","material-ui","ui","view","viewgroup"],"created_at":"2024-08-01T19:00:42.187Z","updated_at":"2026-01-21T07:15:51.169Z","avatar_url":"https://github.com/arthur3486.png","language":"Java","funding_links":[],"categories":["Java"],"sub_categories":[],"readme":"# BottomSheets\n\n\u003e ***Android library designed to enrich your application with the beautiful stutter-free Material Design Bottom Sheets***\n\nBottomSheets will help you make your application more appealing to your end users with its sleek stutter-free implementation of the Material Bottom Sheets.\n\n[ ![Download](https://api.bintray.com/packages/arthurimsacc/maven/bottomsheets-core/images/download.svg) ](https://bintray.com/arthurimsacc/maven/bottomsheets-core/_latestVersion)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Platform](https://img.shields.io/badge/platform-Android-green.svg)](http://developer.android.com/index.html)\n![](https://img.shields.io/badge/API-21%2B-green.svg?style=flat)\n![](https://travis-ci.org/arthur3486/bottomsheets.svg?branch=master)\n[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-BottomSheets-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/7720)\n\n## Contents\n\n* [Demo](#demo)\n* [Getting Started](#getting-started)\n* [Structure](#structure)\n* [Basic Custom Implementation](#basic-custom-implementation)\n* [Action Picker Implementation](#action-picker-implementation)\n* [Custom Action Picker Implementation](#custom-action-picker-implementation)\n* [Advanced Use](#advanced-use)\n* [Contribution](#contribution)\n* [Hall of Fame](#hall-of-fame)\n* [License](#license)\n\n## Demo\n\n* Demo Video\n\n\u003cdiv style=\"dispaly:flex\"\u003e\n\t\u003ca href=\"https://www.youtube.com/watch?v=hfvWiqZiqUU\"\u003e\n\t\t\u003cimg src=\"https://github.com/arthur3486/bottomsheets/blob/master/5.jpg\" width=\"60%\"\u003e\n\t\u003c/a\u003e\n\u003c/div\u003e\n\n* Screenshots\n\n\u003cdiv style=\"dispaly:flex\"\u003e\n    \u003cimg src=\"https://github.com/arthur3486/bottomsheets/blob/master/1.jpg\" width=\"24%\"\u003e\n    \u003cimg src=\"https://github.com/arthur3486/bottomsheets/blob/master/2.jpg\" width=\"24%\"\u003e\n    \u003cimg src=\"https://github.com/arthur3486/bottomsheets/blob/master/3.jpg\" width=\"24%\"\u003e\n    \u003cimg src=\"https://github.com/arthur3486/bottomsheets/blob/master/4.jpg\" width=\"24%\"\u003e\n\u003c/div\u003e\n\n## Getting Started\n\n1. Make sure that you've added the `jcenter()` repository to your top-level `build.gradle` file.\n\n````groovy\nbuildscript {\n    //...\n    repositories {\n        //...\n        jcenter()\n    }\n    //...\n}\n````\n\n2. Add the library dependency to your module-level `build.gradle` file.\n\u003e ***Latest version:*** [ ![Download](https://api.bintray.com/packages/arthurimsacc/maven/bottomsheets-core/images/download.svg) ](https://bintray.com/arthurimsacc/maven/bottomsheets-core/_latestVersion)\n\n````groovy\next {\n    //...\n    bottomSheetsLibraryVersion = \"1.0.0\"\n}\n\ndependencies {\n    //...\n    implementation \"com.arthurivanets.bottomsheet:bottomsheets-core:1.0.0\"\n}\n````\n\n3. Enable the **jetifier** and **androidX** support in the top-level `gradle.properties` file.\n\n````groovy\n//...\nandroid.enableJetifier=true\nandroid.useAndroidX=true\n//....\n````\n\n4. Update your `compileSdkVersion` in the module-level `build.gradle` file to **28+**.\n\n````groovy\n//...\nandroid {\n    //...\n    compileSdkVersion 28\n    //...\n}\n//...\n````\n\n5. Update your `com.android.support.appcompat.*` dependency to the new `androidx.appcompat.*` alternative.\n\n````groovy\n//...\ndependencies {\n    //...\n    implementation \"androidx.appcompat:appcompat:1.0.2\"\n    //...\n}\n//...\n````\n\n6. Proceed with the implementation.\n\u003e ***See: [Structure](#structure), [Basic Custom Implementation](#basic-custom-implementation)***\n\n## Structure\n\nThe library is comprised of 3 modules, namely:\n\n* [`bottomsheets-core`](https://bintray.com/arthurimsacc/maven/bottomsheets-core/_latestVersion) - core functionality (Required)\n* [`bottomsheets-sheets`](https://bintray.com/arthurimsacc/maven/bottomsheets-sheets/_latestVersion) - concrete implementations of the common bottom sheet types (Optional)\n* [`bottomsheets-ktx`](https://bintray.com/arthurimsacc/maven/bottomsheets-ktx/_latestVersion) - common extensions and utils (Optional)\n\nThe first module - [`bottomsheets-core`](https://bintray.com/arthurimsacc/maven/bottomsheets-core/_latestVersion) - is a base module the other modules depend on, it is the starting point for all of your custom bottom sheet implementations and is a required module. This module provides you with the base classes required for the bottom sheet implementation, such as the [`BaseBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-core/src/main/java/com/arthurivanets/bottomsheets/BaseBottomSheet.java) which should be extended by your custom implementations of the bottom sheet and [`BottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-core/src/main/java/com/arthurivanets/bottomsheets/BottomSheet.java) contract which exposes its supported public APIs, here you will also find the [`Config.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-core/src/main/java/com/arthurivanets/bottomsheets/config/Config.java) class which will help you customize the bottom sheet.\n\nThe second module - [`bottomsheets-sheets`](https://bintray.com/arthurimsacc/maven/bottomsheets-sheets/_latestVersion) - is an optional module which includes the implementations of the most common bottom sheet types. Here you will find the [`ActionPickerBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/ActionPickerBottomSheet.java), [`CustomActionPickerBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/CustomActionPickerBottomSheet.java), as well as the coresponding configuration class - [`Config.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/config/Config.java). This module depends on the [`bottomsheets-core`](https://bintray.com/arthurimsacc/maven/bottomsheets-core/_latestVersion) and the [`Adapster`](https://github.com/arthur3486/adapster) library.\n\nThe third and last module - [`bottomsheets-ktx`](https://bintray.com/arthurimsacc/maven/bottomsheets-ktx/_latestVersion) - is a collection of the extensions and general utils. Here you'll be able to find the [`BottomSheetsExtensions.kt`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-ktx/src/main/java/com/arthurivanets/bottomsheets/ktx/BottomSheetsExtensions.kt) which will simplify the creation of the common bottom sheet types in your Activities and Fragments. This module depends on the [`bottomsheets-core`](https://bintray.com/arthurimsacc/maven/bottomsheets-core/_latestVersion), [`bottomsheets-sheets`](https://bintray.com/arthurimsacc/maven/bottomsheets-sheets/_latestVersion) and the [`Adapster`](https://github.com/arthur3486/adapster) library.\n\n## Basic Custom Implementation\n\n**IMPORTANT**: In order to prevent the visual inconsistencies which might be caused by certain UI elements of the Application Theme, it is recommended that you specify the Application/Activity Theme without the Action Bar (any variant of the `Theme.NoActionBar` will suffice). You might also want to make your Status Bar translucent for more immersive experience.\n\nIn order to implement a basic custom bottom sheet you need to follow three simple steps:\n1) Create a new class and extend it from the [`BaseBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-core/src/main/java/com/arthurivanets/bottomsheets/BaseBottomSheet.java).\n2) Provide the custom content view for your bottom sheet in the [`onCreateSheetContentView(...)`](https://github.com/arthur3486/bottomsheets/blob/master/app/src/main/java/com/arthurivanets/demo/ui/widget/SimpleCustomBottomSheet.kt#L34).\n3) Use the created bottom sheet in your Activity/Fragment.\n\nSo, let's create a custom bottom sheet class - [`SimpleCustomBottomSheet`](https://github.com/arthur3486/bottomsheets/blob/master/app/src/main/java/com/arthurivanets/demo/ui/widget/SimpleCustomBottomSheet.kt) and provide our own content view:\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eKotlin (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````kotlin\nclass SimpleCustomBottomSheet(\n    hostActivity : Activity,\n    config : BaseConfig = Config.Builder(hostActivity).build()\n) : BaseBottomSheet(hostActivity, config) {\n\n    override fun onCreateSheetContentView(context : Context) : View {\n        return LayoutInflater.from(context).inflate(\n            R.layout.view_simple_custom_bottom_sheet,\n            this,\n            false\n        )\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJava (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````java\npublic class SimpleCustomBottomSheet extends BaseBottomSheet {\n\n    public SimpleCustomBottomSheet(@NonNull Activity hostActivity) {\n        this(hostActivity, new Config.Builder(hostActivity).build());\n    }\n\n    public SimpleCustomBottomSheet(@NonNull Activity hostActivity, @NonNull BaseConfig config) {\n        super(hostActivity, config);\n    }\n\n    @NonNull\n    @Override\n    public final View onCreateSheetContentView(@NonNull Context context) {\n        return LayoutInflater.from(context).inflate(\n            R.layout.view_simple_custom_bottom_sheet,\n            this,\n            false\n        );\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\nAnd now let's use the created [`SimpleCustomBottomSheet`](https://github.com/arthur3486/bottomsheets/blob/master/app/src/main/java/com/arthurivanets/demo/ui/widget/SimpleCustomBottomSheet.kt) in our Activity:\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eKotlin (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````kotlin\nclass MainActivity : AppCompatActivity() {\n\n    private var bottomSheet : BaseBottomSheet? = null\n\n    private fun showCustomBottomSheet() {\n        //...\n        bottomSheet = SimpleCustomBottomSheet(this).also(BottomSheet::show)\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJava (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````java\npublic class MainActivity extends AppCompatActivity {\n\n    private BottomSheet bottomSheet;\n\n    private void showCustomBottomSheet() {\n        //...\n        bottomSheet = new SimpleCustomBottomSheet(this);\n        bottomSheet.show();\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\n## Action Picker Implementation\n\nThe implementation of the Action Picker Bottom Sheet becomes a trivial task with [`ActionPickerBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/ActionPickerBottomSheet.java), as all you need to do here is simply provide a list of options and a bottom sheet configuration.\n\nLet's use the [`ActionPickerBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/ActionPickerBottomSheet.java) in our Activity:\n\n* **With [`bottomsheets-ktx`](https://bintray.com/arthurimsacc/maven/bottomsheets-ktx/_latestVersion)**\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eKotlin (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````kotlin\nclass MainActivity : AppCompatActivity() {\n\n    private var bottomSheet : BottomSheet? = null\n\n    private fun showActionsBottomSheet() {\n        bottomSheet = showActionPickerBottomSheet(\n            options = getActionOptions(),\n            onItemSelectedListener = OnItemSelectedListener {\n                // do something...\n            }\n        )\n    }\n\n    fun getActionOptions() : List\u003cOption\u003e {\n        // your options\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJava (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````java\npublic class MainActivity extends AppCompatActivity {\n\n    private BottomSheet bottomSheet;\n\n    private void showActionsBottomSheet() {\n        bottomSheet = BottomSheetsUtils.showActionPickerBottomSheet(\n            this,\n            getActionOptions(),\n            new OnItemSelectedListener\u003cOption\u003e() {\n                @Override\n                public void onItemSelected(@NonNull Option item) {\n                    // do something\n                }\n            }\n        );\n    }\n\n    private List\u003cOption\u003e getActionOptions() {\n        // your options\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\n* **Without [`bottomsheets-ktx`](https://bintray.com/arthurimsacc/maven/bottomsheets-ktx/_latestVersion)**\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eKotlin (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````kotlin\nclass MainActivity : AppCompatActivity() {\n\n    private var bottomSheet : BottomSheet? = null\n\n    private fun showActionsBottomSheet() {\n        bottomSheet = ActionPickerBottomSheet.init(\n            this,\n            getActionOptions().map(::ActionItem),\n            Config.Builder(this).build()\n        )\n        bottomSheet.setOnItemSelectedListener {\n            // do something...\n        }\n        bottomSheet.show()\n    }\n\n    fun getActionOptions() : List\u003cOption\u003e {\n        // your options\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJava (click to expand)\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n````java\npublic class MainActivity extends AppCompatActivity {\n\n    private BottomSheet bottomSheet;\n\n    private void showActionsBottomSheet() {\n        bottomSheet = ActionPickerBottomSheet.init(\n            this,\n            getActionOptions(),\n            new Config.Builder(this).build()\n        );\n        bottomSheet.setOnItemSelectedListener(new OnItemSelectedListener\u003cActionItem\u003e() {\n            @Override\n            public void onItemSelected(@NonNull ActionItem item) {\n                // do something\n            }\n        });\n        bottomSheet.show();\n    }\n\n    private List\u003cActionItem\u003e getActionOptions() {\n        // your options wrapped into ActionItem(-s)\n    }\n\n}\n````\n\n\u003c/p\u003e\u003c/details\u003e\u003cbr\u003e\n\n## Custom Action Picker Implementation\n\nThe implementation of the Custom Action Picker Bottom Sheet is not that much different from the [`Action Picker Implemenetation`](#action-picker-implementation), you just need to use the [`CustomActionPickerBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/CustomActionPickerBottomSheet.java) instead of the [`ActionPickerBottomSheet.java`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/ActionPickerBottomSheet.java) in conjunction with your custom [`BaseActionItem`](https://github.com/arthur3486/bottomsheets/blob/master/bottomsheets-sheets/src/main/java/com/arthurivanets/bottomsheets/sheets/adapters/actionpicker/BaseActionItem.java)-based Items and that's it.\n\nSee the example of a [Custom Action Picker in Action](https://github.com/arthur3486/bottomsheets/blob/master/app/src/main/java/com/arthurivanets/demo/ui/MainActivity.kt#L99).\n\n## Advanced Use\n\nSee the [Sample app](https://github.com/arthur3486/bottomsheets/tree/master/app/src/main/java/com/arthurivanets/demo).\n\n## Contribution\n\nSee the [CONTRIBUTING.md](CONTRIBUTING.md) file.\n\n## Hall of Fame\n\n\u003ctable\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd valign=\"middle;\"\u003e\n\t            \u003ca href=\"https://play.google.com/store/apps/details?id=com.arthurivanets.reminder\"\u003e\n                    \u003cimg src=\"https://lh3.googleusercontent.com/uD65OOIxM1-khzDI5OowwdzjD9j8CgelcH9mBGAZWIAsAyoTtEE7smUH9GAf3mCg8AA=s360\" width=\"70\" height=\"70\"/\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd valign=\"middle;\"\u003e\u003cb\u003eReminder\u003c/b\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd valign=\"middle;\"\u003e\n                \u003ca href=\"https://play.google.com/store/apps/details?id=com.arthurivanets.owly\"\u003e\n\t                \u003cimg src=\"https://lh3.googleusercontent.com/FHaz_qNghV02MpQBEnR4K3yVGsbS_0qcUsEHidzfujI3V01zyLp6yo7oK0-ymILdRk9k=s360-rw\" width=\"70\" height=\"70\"/\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd valign=\"middle;\"\u003e\u003cb\u003eOwly\u003c/b\u003e\u003c/td\u003e\n    \t\u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003e Using BottomSheets in your app and want it to get listed here? Email me at arthur.ivanets.work@gmail.com!\n\n## License\n\nBottomSheets library is licensed under the [Apache 2.0 License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farthur3486%2Fbottomsheets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farthur3486%2Fbottomsheets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farthur3486%2Fbottomsheets/lists"}