BottomSheetMenu style dialogs for Android

Related tags

Menu BottomSheetMenu
Overview

BottomSheetMenu

Android Arsenal

screenshot screenshot screenshot screenshot screenshot

Features

  • Both list and grid style
  • Light and Dark theme as well as custom themeing options
  • XML style support
  • Tablet support
  • Share Intent Picker
  • API 19+
  • Kotlin support

Using BottomSheetMenu

To get started using BottomSheetMenu, first you'll need to create a menu resource file with the defined actions.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/share"
        android:icon="@drawable/ic_share_grey_600_24dp"
        android:title="Share" />

    <item
        android:id="@+id/upload"
        android:icon="@drawable/ic_cloud_upload_grey_600_24dp"
        android:title="Upload" />

    <item
        android:id="@+id/copy"
        android:icon="@drawable/ic_content_copy_grey_600_24dp"
        android:title="Copy" />

    <item
        android:id="@+id/print"
        android:icon="@drawable/ic_print_grey_600_24dp"
        android:title="Print" />

</menu>

Then create a BottomSheetMenuDialogFragment via the Builder class using either the Builder method calls for java or named arguments for Kotlin

new BottomSheetMenuDialogFragment.Builder(getActivity())
  .setSheet(R.menu.bottom_sheet)
  .setTitle(R.string.options)
  .setListener(myListener)
  .setObject(myObject)
  .show(getSupportFragmentManager());
BottomSheetMenuDialogFragment.Builder(context = this,
      sheet = R.menu.bottom_sheet,
      listener = myListener,
      title = R.string.options,
      `object` = myObject)
      .show(supportFragmentManager)

Styling

BottomSheetMenu comes with both a Light and Dark theme to accommodate most scenarios. However, if you want to customize itr more, you can create your own style and supply it to the builder.
Customizable attributes are:

<!-- The text appearance of the title -->
<attr name="bottom_sheet_menu_title_text_appearance" format="reference" />

<!-- The number of columns to show when using the grid style -->
<attr name="bottom_sheet_menu_column_count" format="integer" />

<!-- The selector to be used for the items in the list/grid -->
<attr name="bottom_sheet_menu_selector" format="reference" />

<!-- The text appearance of the list items -->
<attr name="bottom_sheet_menu_list_text_appearance" format="reference" />

<!-- The text appearance of the grid items -->
<attr name="bottom_sheet_menu_grid_text_appearance" format="reference" />

Then create a style

<style name="MyBottomSheetMenuStyle" parent="@style/Theme.BottomSheetMenuDialog">
    <item name="bottom_sheet_menu_title_text_appearance">@style/TitleAppearance</item>
    <item name="bottom_sheet_menu_list_text_appearance">@style/ListAppearance</item>
    <item name="bottom_sheet_menu_grid_text_appearance">@style/GridAppearance</item>
</style>

<style name="TitleAppearance" parent="BottomSheetMenu.Title.TextAppearance">
    <item name="android:textColor">@android:color/holo_green_light</item>
</style>

<style name="ListAppearance" parent="BottomSheetMenu.ListItem.TextAppearance">
    <item name="android:textColor">@android:color/holo_red_light</item>
    <item name="android:textSize">18sp</item>
</style>

<style name="GridAppearance" parent="BottomSheetMenu.GridItem.TextAppearance">
    <item name="android:textColor">@android:color/holo_red_light</item>
    <item name="android:textSize">20sp</item>
</style>

Also note that each of these pre-defined styles also have a light theme. They are named similary with a .Light added to the end of the style name
@style/Theme.BottomSheetMenuDialog.Light @style/BottomSheetMenu.Title.TextAppearance.Light etc...

Then finally pass the style into the Builder object.

new BottomSheetMenuDialogFragment.Builder(getActivity(), R.style.MyBottomSheetStyle)
  .setSheet(R.menu.bottom_sheet)
  .setTitle(R.string.options)
  .setListener(myListener)
  .show();
BottomSheetMenuDialogFragment.Builder(context = this,
        sheet = R.menu.bottom_sheet,
        title = R.string.options,
        listener = myListener,
        style = R.style.MyBottomSheetStyle)
        .show(supportFragmentManager)

Icons

Based on the Material Design Guidelines, icons for a linear list styled BottomSheet should be 24dp, where as a grid styled BottomSheet should be 48dp.

Share Intents

BottomSheetMenu can also be used to create a Share Intent Picker that will be styled like the ones found in Android 5.x+. To create one, simply call one of the static createShareBottomSheet methods.

Intent(Intent.ACTION_SEND).apply {
    type = "text/*"
    putExtra(Intent.EXTRA_TEXT, "My text to share")
    // Make sure to check that the createBottomSheet method does not return null!! 
    // If the device can not handle the intent, null will be returned
    BottomSheetMenuDialogFragment.createShareBottomSheet(context, this, "My Title")?.show(supportFragmentManager, null)
}

For further customization of the share intent including which apps will be either be shown or not shown, see the full signature of createBottomSheet

Callbacks

BottomSheetMenu uses the BottomSheetListener for callbacks

 /**
     * Called when the [BottomSheetMenuDialogFragment] is first displayed
     *
     * @param bottomSheet The [BottomSheetMenuDialogFragment] that was shown
     * @param object      Optional [Object] to pass to the [BottomSheetMenuDialogFragment]
     */
    fun onSheetShown(bottomSheet: BottomSheetMenuDialogFragment, `object`: Any?)

    /**
     * Called when an item is selected from the list/grid of the [BottomSheetMenuDialogFragment]
     *
     * @param bottomSheet The [BottomSheetMenuDialogFragment] that had an item selected
     * @param item        The item that was selected
     * @param object      Optional [Object] to pass to the [BottomSheetMenuDialogFragment]
     */
    fun onSheetItemSelected(bottomSheet: BottomSheetMenuDialogFragment, item: MenuItem, `object`: Any?)

    /**
     * Called when the [BottomSheetMenuDialogFragment] has been dismissed
     *
     * @param bottomSheet  The [BottomSheetMenuDialogFragment] that was dismissed
     * @param object       Optional [Object] to pass to the [BottomSheetMenuDialogFragment]
     * @param dismissEvent How the [BottomSheetMenuDialogFragment] was dismissed. Possible values are: <br></br>
     *  * [.DISMISS_EVENT_SWIPE]
     *  * [.DISMISS_EVENT_MANUAL]
     *  * [.DISMISS_EVENT_ITEM_SELECTED]
     */
    fun onSheetDismissed(bottomSheet: BottomSheetMenuDialogFragment, `object`: Any?, @DismissEvent dismissEvent: Int)

Upgrading to 3.X

  • BottomSheet has been renamed to BottomSheetMenuDialogFragment
  • Custom views and simple messages are no longer supported. Please use a BottomSheetDialogFragment and customize it from there
  • Many of the theme attributes have been removed or renamed. See the Styling section above for current values
  • CollaspingView has been removed.
  • Migration to AndroidX and Google Material Components
  • MinSdk is now 19, also targeting API 28

Upgrading From 1.x

When upgrading to 2.x from a 1.x release, some changes will have to be made.

  • All of the builder methods for settings colors have been removed. All customzing should be done through themes.
  • The style attributes have been change to text appearances rather than colors.
  • The Builder constructor no longer takes a menu object. You will need to call setSheet(...).
  • The onSheetDismissed callback now takes an int as an argument for simple message support.
  • The gradle dependency has changed and needs to be updated.

Including in your project

To include BottomSheet in your project, make the following changes to your build.gradle file

Add repository

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

Add dependency

dependencies {
     implementation 'com.github.Kennyc1012:BottomSheetMenu:3.2.3'
}

Contribution

Pull requests are welcomed and encouraged. If you experience any bugs, please file an issue

License

Copyright 2015 Kenny Campagna

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Menu Item Edit

    Menu Item Edit

    Hi! Your library is great :+1: but I can't understand how to access to Menu Items for change visibility/title/icon of each item using static menu resource as sheet.

    How can I do that? ( before the sheet is visible ) Thanks :smile:

    opened by fcannizzaro 9
  • Question: is it possible to disable dimming, make content above touchable, and scroll?

    Question: is it possible to disable dimming, make content above touchable, and scroll?

    I'm trying to do something like on Google Maps, where the content above the bottom sheet is touchable, there is no dimming, and I can scroll the bottom sheet till it shows its whole content , and even further if there is a lot of content.

    Is it possible on this library to have this behavior ?

    opened by AndroidDeveloperLB 7
  • Add an option to tint menu icons

    Add an option to tint menu icons

    Used to change the color of menu item icons.

    • setMenuItemTintColor - Takes the color int to tint the icons with
    • setMenuItemTintColorRes - Takes a resource id as parameter, resolves the color and then calls setMenuItemTintColor(resolvedColor)

    Example usage:

                final BottomSheet.Builder builder = new BottomSheet.Builder(mActivity);
                builder.setTitle(weirdThing.getTitle())
                        .setListener(appBottomSheetListener)
                        .setMenuItemTintColor(Color.GREEN);
    

    Screenshots - I am applying the tint depending on the primary color of the app

    screenshot_2015-08-19-09-44-16

    screenshot_2015-08-19-09-44-30

    opened by amartinz 7
  • supportsRtl

    supportsRtl

    Hello dear. is it possible for u to remove or change this line supportsRtl="true" (here) from ur project? i do not want to support RTL but i cant set it to false, because ur library set it true and for result android studio give me this:

    Error:Execution failed for task ':app:processDebugManifest'.
    > Manifest merger failed : Attribute application@supportsRtl value=(false) from AndroidManifest.xml:21:9-36
        is also present at [com.github.Kennyc1012:BottomSheet:2.1.1] AndroidManifest.xml:11:18-44 value=(true).
        Suggestion: add 'tools:replace="android:supportsRtl"' to <application> element at AndroidManifest.xml:15:5-62:19 to override. 
    
    opened by miladna7 6
  • Icons are displayed with a colored background when using createShareBottomSheet()

    Icons are displayed with a colored background when using createShareBottomSheet()

    I am testing this library on a physical device with Android v17 (Jellybean). I am noticing 2 issues

    1. The icons of Shae Intents are filled with some background color. I am attaching an image for reference. Please have a closer look at the icons of Gmail, SHAREit and TubeMate. All have a blue background instead of plain white.
    2. The other issue is the icon size. They seem to appear small (I might be wrong, but probably not). I read this line "icons for a linear list styled BottomSheet should be 24dp", but...

    device-2016-07-16-234440

    Regards

    bug 
    opened by CeJienAJPC 4
  • Number of columns if Grid?

    Number of columns if Grid?

    Is there any way to set the number of columns using the grid? I have the same number of items like in the example. It doesnt look good having 4 icons on the first row and then 2 icons on the bottom row. Is there any settings I could change to set number of columns?

    Thanks

    enhancement 
    opened by allanguintu 4
  • A sheet crashes when using vector icon

    A sheet crashes when using vector icon

    I got this error when I uses vector icon in a menu

    android.content.res.Resources$NotFoundException: File res/drawable-hdpi-v4/ic_translate_grey_48dp.xml from drawable resource ID #0x7f02008d. If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.
    	at android.content.res.Resources.loadDrawable(Resources.java:2600)
    	at android.content.res.Resources.getDrawable(Resources.java:795)
    	at com.kennyc.bottomsheet.b.b.setIcon(Unknown Source)
    	at android.view.MenuInflater$MenuState.setItem(MenuInflater.java:399)
    	at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:451)
    	at android.view.MenuInflater.parseMenu(MenuInflater.java:188)
    	at android.view.MenuInflater.inflate(MenuInflater.java:110)
    
    opened by aratn0n 3
  • Menu items

    Menu items

    Hi i really like the bottomsheet it looks great i'm working on a web browser and i've implemented it to launch an app from a web url but i've got a problem with the bottom sheet items not working or crashing when you load it from shouldOverrideUrlLoading i have attached the code so you can see and when i click these items the app crashes can you give me any suggestions ?

    opened by ghost 3
  • RTL Support

    RTL Support

    When i switch from Left to right the icons appears in the right but the menu title and the BottomSheet Title is to left how can i support RTL thanks in advance.

    enhancement 
    opened by mohSalah66 3
  • Customize Size

    Customize Size

    I define custom width in XML view, but it not work. <LinearLayout... android:layout_width="XXXdp" ... /> Is there an other way to do that?

    opened by swotino 3
  • BottomSheet not anchoring to bottom of screen

    BottomSheet not anchoring to bottom of screen

    On my emulator, BottomSheet works perfectly, anchored to bottom margin of screen. With the same code, on my device, there is a gap appearing between bottom of screen and bottom sheet. The sheet inflates a custom layout view, but there is nothing in the XML to suggest why a margin should appear, nor why different devices might render different end results. Any idea? I can post my XML...

    Emulator emulator Device device

    opened by iaindownie 2
  • QUERY_ALL_PACKAGES permission

    QUERY_ALL_PACKAGES permission

    Hello,

    First of all, thank you for this library. It's neat :)

    This permission causes an error on Google Play: "QUERY_ALL_PACKAGES: A permission for your app to see all the apps installed on a device. If it is not needed, you should remove it from your app."

    Apparently, this was added some time ago, but I don't see the reason why this has been added. I've tested my app without this permission, and it works fine.

    opened by SoreGaInochi 3
  • More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'.

    More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'.

    Hello,

    Since I have updated from 3.0.1 to 3.2.3 I am having troubles to build my app :

    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:mergeDebugJavaResource'.
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
    	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
    	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
    	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
    	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
    	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
    	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
    	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
    	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
    	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
    	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
    	at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:336)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:142)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.access$000(DefaultAsyncWorkTracker.java:34)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker$1.run(DefaultAsyncWorkTracker.java:106)
    	at org.gradle.internal.Factories$1.create(Factories.java:26)
    	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:251)
    	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutProjectLock(DefaultWorkerLeaseService.java:162)
    	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutProjectLock(DefaultWorkerLeaseService.java:156)
    	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withoutProjectLock(StopShieldingWorkerLeaseService.java:95)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:102)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:80)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:68)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:577)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
    	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
    	at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$0(ExecuteStep.java:32)
    	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:32)
    	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
    	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
    	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
    	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
    	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
    	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
    	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
    	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
    	at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
    	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
    	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
    	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
    	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
    	at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
    	at org.gradle.internal.execution.steps.CacheStep.executeAndStoreInCache(CacheStep.java:135)
    	at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$2(CacheStep.java:112)
    	at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$3(CacheStep.java:112)
    	at org.gradle.internal.Try$Success.map(Try.java:162)
    	at org.gradle.internal.execution.steps.CacheStep.executeWithCache(CacheStep.java:81)
    	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:71)
    	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
    	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
    	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
    	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
    	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
    	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
    	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
    	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
    	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
    	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
    	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
    	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
    	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
    	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
    	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
    	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
    	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
    	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
    	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
    	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
    	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
    	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
    	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
    	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    Caused by: com.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'.
    	at com.android.builder.merge.StreamMergeAlgorithms.lambda$acceptOnlyOne$2(StreamMergeAlgorithms.java:85)
    	at com.android.builder.merge.StreamMergeAlgorithms.lambda$select$3(StreamMergeAlgorithms.java:106)
    	at com.android.builder.merge.IncrementalFileMergerOutputs$1.create(IncrementalFileMergerOutputs.java:88)
    	at com.android.builder.merge.DelegateIncrementalFileMergerOutput.create(DelegateIncrementalFileMergerOutput.java:64)
    	at com.android.build.gradle.internal.tasks.MergeJavaResourcesDelegate$run$output$1.create(MergeJavaResourcesDelegate.kt:230)
    	at com.android.builder.merge.IncrementalFileMerger.updateChangedFile(IncrementalFileMerger.java:242)
    	at com.android.builder.merge.IncrementalFileMerger.mergeChangedInputs(IncrementalFileMerger.java:203)
    	at com.android.builder.merge.IncrementalFileMerger.merge(IncrementalFileMerger.java:80)
    	at com.android.build.gradle.internal.tasks.MergeJavaResourcesDelegate.run(MergeJavaResourcesDelegate.kt:276)
    	at com.android.build.gradle.internal.tasks.MergeJavaResRunnable.run(MergeJavaResRunnable.kt:81)
    	at com.android.build.gradle.internal.tasks.Workers$ActionFacade.run(Workers.kt:242)
    	at org.gradle.workers.internal.AdapterWorkAction.execute(AdapterWorkAction.java:57)
    	at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:67)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:63)
    	at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:97)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:63)
    	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
    	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
    	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
    	at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:60)
    	at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$2(DefaultWorkerExecutor.java:200)
    	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:215)
    	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
    	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:131)
    	... 3 more
    

    As workaround I have put in my Gradle android tag :

    packagingOptions { pickFirst 'META-INF/library_release.kotlin_module'}

    But I suggest you to take a look at : https://stackoverflow.com/a/56329676/6049542 to update the library build file.

    opened by DPalagi 0
Releases(4.2)
Owner
Kenny
Kenny
An Android library that allows you to easily create applications with slide-in menus. You may use it in your Android apps provided that you cite this project and include the license in your app. Thanks!

SlidingMenu (Play Store Demo) SlidingMenu is an Open Source Android library that allows developers to easily create applications with sliding menus li

Jeremy Feinstein 11.1k Dec 21, 2022
BottomSheet-Android - A simple customizable BottomSheet Library for Android Kotlin

BottomSheet-Android A simple customizable BottomSheet Library for Android Kotlin

Munachimso Ugorji 0 Jan 3, 2022
an animated circular menu for Android

CircularFloatingActionMenu An animated, customizable circular floating menu for Android, inspired by Path app. Getting Started Requirements API >= 15

Oğuz Bilgener 2.7k Dec 24, 2022
A menu which can ... BOOM! - Android

BoomMenu 2.0.0 Comes Finally Approximately 8 months ago, I got an inspiration to creating something that can boom and show menu, which I named it Boom

Nightonke 5.8k Dec 27, 2022
Animations for Android L drawer, back, dismiss and check icons

Material Menu Morphing Android menu, back, dismiss and check buttons Have full control of the animation: Including in your project compile 'com.balysv

Balys Valentukevicius 2.5k Dec 30, 2022
Android library that provides the floating action button to sheet transition from Google's Material Design.

MaterialSheetFab Library that implements the floating action button to sheet transition from Google's Material Design documentation. It can be used wi

Gordon Wong 1.6k Dec 13, 2022
Android Satellite Menu

#Satellite Menu 'Path' has a very attractive menu sitting on the left bottom corner of the screen. Satellite Menu is the open version of this menu. Fo

Siyamed SINIR 1.4k Nov 15, 2022
An android custom view which looks like the menu in Path 2.0 (for iOS).

ArcMenu & RayMenu ArcMenu An android custom view which looks like the menu in Path 2.0 (for iOS). RayMenu About The user experience in Path 2.0 (for i

daCapricorn 1.3k Nov 29, 2022
iOS UIActionSheet for Android

ActionSheet This is like iOS UIActionSheet component, has iOS6 and iOS7 style, support custom style, background, button image, text color and spacing

星一 810 Nov 10, 2022
DropDownMenu for Android,Filter the list based on multiple condition.

DropDownMenu DropDownMenu for Android,filter the list based on multiple condition. To get this project into your build Step 1. Add the specific reposi

Jay.Fang 808 Nov 10, 2022
(UNMAINTAINED) An implemention of Filter Menu concept for android

FilterMenu This is a library project with a custom view that implements concept of Filter Menu(https://dribbble.com/shots/1956586-Filter-Menu) made by

Lin Zhang 824 Nov 28, 2022
Navigation menu for Android (based off Google+ app)

RibbonMenu Navigation menu for Android (based on Google+ app). Usage Menus are created in xml as normal, adding text and an icon. In the layout you wa

David Scott 487 Nov 24, 2022
Simple and easy to use circular menu widget for Android.

Deprecated This project is no longer maintained. No new issues or pull requests will be accepted. You can still use the source or fork the project to

Anup Cowkur 420 Nov 25, 2022
A multicard menu that can open and close with animation on android

MultiCardMenu A multicard menu that can open and close with animation on android,require API level >= 11 Demo ##Usage <net.wujingchao.android.view.

null 562 Nov 10, 2022
Implementation of "Side Navigation" or "Fly-in app menu" pattern for Android (based on Google+ app)

Android SideNavigation Library Implementation of "Side Navigation" or "Fly-in app menu" pattern for Android (based on Google+ app). Description The Go

Evgeny Shishkin 319 Nov 25, 2022
Android - Blur Navigation Drawer like Etsy app.

Blur Navigation Drawer Library[DEPRECATED] Blur Navigation Drawer like Etsy app. Demo You can download a demo here. Updates Version 1.1 Add support fo

Vasilis Charalampakis 414 Nov 23, 2022
Simple library which enable you to add a drawer(slide-out) navigation to your android application

SimpleSideDrawer is an android library to add a drawer navigation into your android application. This library has high affinity with other libraries l

null 217 Nov 25, 2022