- 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: выдвигающийся экран снизу
- Зависимости
- Создание макетов
- Container view
- Динамическое управление
- Прикрепление элементов к нижнему экрану
- Скрытие плавающей кнопки при скроле
- Bottom Sheet moves up along with Keyboard in Android and not iOS #203
- Comments
- shubh007-dev commented Apr 5, 2020
- karimcambridge commented Apr 5, 2020 •
- shubh007-dev commented Apr 6, 2020
- shubh007-dev commented Apr 6, 2020
- karimcambridge commented Apr 6, 2020
- gabrielmoncea commented Apr 15, 2020
- karimcambridge commented Apr 15, 2020
- ljmocic commented Apr 27, 2020
- yzalvov commented May 26, 2020 •
- yzalvov commented May 31, 2020
- I updated the code above respectively:
- karimcambridge commented May 31, 2020
- yzalvov commented May 31, 2020
- karimcambridge commented May 31, 2020
- paolosantarsiero commented Jun 14, 2020 •
- brentvatne commented Jun 18, 2020
- karimcambridge commented Jun 18, 2020
- martppa commented Sep 3, 2020
- jbolotin commented Oct 2, 2020
- PedroBern commented Oct 27, 2020
- mayconmesquita commented Nov 17, 2020
- Alix-stack commented Jan 29, 2021
- ansarikhurshid786 commented Feb 15, 2021
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.
Источник
Android: выдвигающийся экран снизу
Данная статья является переводом статьи Emrullah Luleci, а также её продолжения.
Нижний экран (Здесь и далее под «нижним экраном/слоем» будет подразумеваться элемент bottom sheet — прим. пер.) — компонент, выезжающий снизу экрана, который используется для отображения дополнительного контента. Подробнее об этом элементе можно узнать на официальной сайте посвященном материальному дизайну.
Зависимости
Для использования этого элемента, добавьте последние версии библиотек поддержки в свой проект:
Создайте класс наследник от AppCompatActivity:
Создание макетов
Содержимое нижнего экрана
Для удобства воспользуемся макетами. Назовем файл с нижним слоем bottom_sheet.xml.
behavior_peekHeight: Определяет высоту видимой части.
behavior_hideable: Определяет, может ли нижний экран скрываться свайпом вниз.
Container view
Создайте CoordinatorLayout в качестве корневого вью. Добавьте в него прямым наследником bottom_sheet.xml. Элементы app_bar и activity_bottom_sheet_content не имеют прямого отношения к нижнему экрану, поэтому их можно заменить или удалить.
На данном этапе нижний экран должен работать примерно так:
Динамическое управление
Поведением и свойствами нижнего экрана можно также управлять динамически с помощью Java.
Прикрепление элементов к нижнему экрану
Также можно прикрепить вью к нижнему экрану, чтобы прикрепленный элемент перемещался одновременно с нижним слоем.
Добавим Floating Action Button в макет созданный выше. Новый компонент должен являться непосредственным наследником CoordinatorLayout также как и bottom_sheet. Для прикрепления элемента к нижнему экрану необходимо добавить app:layout_anchor с id вью нижнего экрана, а также app:layout_anchorGravity со значением top|end.
Теперь плавающая кнопка закреплена в верхнем углу нашего нижнего экрана и перемещается вместе с ним.
Скрытие плавающей кнопки при скроле
Для скрытия кнопки при скроле необходимо добавить слушатель к нижнему экрану и отображать/скрывать кнопку. Для начала найдем необходимые вью:
Для скрытия кнопки в момент начала скрола и отображения после полного сворачивания нижнего экрана, используйте следующее:
Результат обоих вариантов можно увидеть ниже:
Источник
Bottom Sheet moves up along with Keyboard in Android and not iOS #203
Comments
shubh007-dev commented Apr 5, 2020
I guess my question is similar to the below question
#63
And I’ve posted my question on Stack Overflow, please check the below link for it.
The text was updated successfully, but these errors were encountered:
karimcambridge commented Apr 5, 2020 •
Yea it’s happening when the top container is flex: 1, if you remove flex and set height to 100%, it fixes it, but this causes issues if you have your map with flex: 1
I have this same issue how do we fix this?
shubh007-dev commented Apr 6, 2020
@osdnk @brentvatne can you please help us with this problem? 🙂
shubh007-dev commented Apr 6, 2020
@karimcambridge using android:windowSoftInputMode=»adjustPan» in AndroidManifest.xml worked for me! 😀
karimcambridge commented Apr 6, 2020
Yes, I use expo tho so that can’t help me sadly.
gabrielmoncea commented Apr 15, 2020
@shubh007-dev your solution worked for me too
karimcambridge commented Apr 15, 2020
Yes that solution is garanteed for now.
For people using Expo and cannot eject, you have to not use flex in your views. Use heights.
ljmocic commented Apr 27, 2020
In my case it was not easy adjustable for switching from flex to height inside sheet.
I’ve added onFocus to TextInput for snapping to the highest snap point and added listener to bring sheet back to starting point when keyboard closes.
yzalvov commented May 26, 2020 •
- height: 100% didn’t work for me.
- Works in Expo Managed Workflow project for me where android:windowSoftInputMode=»adjustPan» is not possible.
yzalvov commented May 31, 2020
Well, as it turned out by testing on different Android devices, the device screen height for the Container was not magical enough. Plus I have a MapView ( react-native-maps ) inside it, which revealed its own problems. I guess @karimcambridge told about them. So I had to tune this up too. It works almost fine now. The sheet content still has a small bump, but at least the Container and the MapView are as expected.
I updated the code above respectively:
- minHeight: ‘100%’ for the Container .
- The device screen height as maxHeight and minHeight: ‘100%’ for the MapViewContainer
karimcambridge commented May 31, 2020
That should work.
yzalvov commented May 31, 2020
Thanks @karimcambridge ! Now it’s perfect. With minHeight: hp(‘100%’) for my screen Container (minHeight in my case) 🙏🏽
karimcambridge commented May 31, 2020
Thanks @karimcambridge ! Now it’s perfect. With minHeight: hp(‘100%’) for my screen Container (minHeight in my case) 🙏🏽
Glad we can help each other. You’ve completed my app with the patch you posted earlier.
I’ll be notifing the repo owner about these fixes and issues by email so hopefully when he has some time everyone can enjoy these fixes smoothly.
paolosantarsiero commented Jun 14, 2020 •
I tried to implement with react native maps and it works fine. But when keyboard is opened after the map not works! Any suggestions? I try to put minHeight: hp(‘100%’) in the container and in the map but not works!
I fixed it with KeyboardAvoidingView behavior=»height» as a container
brentvatne commented Jun 18, 2020
if you’re using the expo managed workflow then in sdk 38 (soon to be released) you will be able to toggle between the android:windowSoftInputMode adjustPan and adjustResize in app.json as described and implemented in this pr expo/expo#8842
karimcambridge commented Jun 18, 2020
if you’re using the expo managed workflow then in sdk 38 (soon to be released) you will be able to toggle between the android:windowSoftInputMode adjustPan and adjustResize in app.json as described and implemented in this pr expo/expo#8842
martppa commented Sep 3, 2020
I solved the issue changing the snapTo height which is the dynamicBottomSheetHeight
jbolotin commented Oct 2, 2020
Simple solution that worked well for me: instead of having a snapPoint at 0% , set it to -100% . Everything seems to work the same, but they keyboard issue is fixed
PedroBern commented Oct 27, 2020
This worked for me on Expo SDK 39, in app.json :
mayconmesquita commented Nov 17, 2020
I solved the issue changing the snapTo height which is the dynamicBottomSheetHeight
Thank you! Its working!
Alix-stack commented Jan 29, 2021
@karimcambridge using android:windowSoftInputMode=»adjustPan» in AndroidManifest.xml worked for me! 😀
yes it’s works in android but not working in ios
ansarikhurshid786 commented Feb 15, 2021
there is no issue in ios and in android android:windowSoftInputMode=»adjustPan» works
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Источник