Bottom Sheets trong Android
Bài đăng này đã không được cập nhật trong 7 năm
Bottom Sheet là 1 thành phần được thiết kế theo phong cách material design, được thêm vào thư viện design support library trong phiên bản 23.2. Bottom sheet là 1 cửa sổ đơn giản hiển thị từ dưới đáy của màn hình và có thể được sử dụng để hiện ra nhiều thông tin hơn cho người dùng. Ví dụ của bottom sheet có thể đựoc thấy trong 1 số ứng dụng của Google, như Place Picker của Places API.
Trong bài viết này, mình sẽ giới thiệu cách tạo bottom sheets trong ứng dụng của bạn.
Bottom sheet có thể là 1 phần của giao diện hoặc là 1 hộp hội thoại tạm thời. Để làm được các chức năng này, thư viện design support cung cấp:
- BottomSheetBehavior được sử dụng với CoordinatorLayout
- BottomSheetDialog là 1 hộp hội thoại với các thao tác như bottom sheet
- BottomSheetDialogFragment mở rộng từ DialogFragment, từ đó tạo 1 BottomSheetDialog thay cho 1 dialog thông thường.
Để bắt đầu bạn phải thêm thư viện vào ứng dụng:
compile 'com.android.support:design:<latest-library-version>'
Tạo bottom sheet cố định
Để tạo 1 bottom sheet là 1 phần của giao diện:
- Tạo 1 layout với CoordinatorLayout là gốc, sau đó thêm view hoặc layout cho bottom sheet, là 1 thành phần con trực tiếp của CoordinatorLayout. Bottom sheet layout phải có thuộc tính app:layout_behavior, với giá trị là android.support.design.widget.BottomSheetBehavior
Ví dụ:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mayojava.sample.bottomsheetdemo.MainActivity">
<!-- main content layout-->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
......
</RelativeLayout>
<!-- bottom sheet layout -->
<RelativeLayout
android:id="@+id/linear_layout_bottom_sheet"
android:layout_width="match_parent"
android:layout_height="220dp"
app:behavior_peekHeight="80dp"
app:behavior_hideable="true"
app:layout_behavior="@string/string_bottom_sheet_behavior"
android:elevation="@dimen/z_bottom_sheet"
android:background="@color/color_bottom_sheet">
<TextView
android:id="@+id/text_view_sheet_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text_pull_to_show_more"
android:textSize="@dimen/text_size_medium"
android:padding="@dimen/activity_vertical_margin"/>
<TextView
android:id="@+id/text_view_more_content"
android:text="@string/text_more_contet_to_user"
android:textSize="@dimen/text_size_big"
android:textStyle="bold"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/text_view_sheet_title"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin"/>
<Button
android:text="@string/text_click_me"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginLeft="@dimen/activity_vertical_margin"
android:layout_marginRight="@dimen/activity_vertical_margin"
android:layout_marginTop="@dimen/activity_vertical_margin" android:layout_below="@+id/text_view_more_content"/>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
- Để bottom sheet có thể hiển thị, ta cần tạo 1 BottomSheetBehavior bằng cách gọi BottomSheetBehavior.from(), truyền vào 1 tham số đến view với thuộc tính bottom behavior đối với lời gọi.
LinearLayout bottomSheetLayout
= (LinearLayout) findViewById(R.id.layout_bottom_sheet);
//get bottom sheet behavior from bottom sheet view
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(mLayoutBottomSheet);
With a reference to the BottomSheetBehavior object, we can call the setState
Vơí tham chiếu tới đối tượng BottomSheetBehavior, ta có thể gọi phuơng thức setState, truyền các hành động khác nhau:
- BottomSheetBehavior.STATE_EXPANDED: Mở rộng tối đa bottom sheet.
- BottomSheetBehavior.STATE_HIDE: ẩn đi bottom sheet.
- BottomSheetBehavior.STATE_COLLAPSED: đặt chiều cao cho bottom sheet với giá trị cho thuộc tính peekHeight.
//to expand the bottom sheet
mbottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
//to collapse the bottom sheet
mbottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
peekHeight có thể được sử dụng để hiển thị 1 phần nhỏ của bottom sheet trên màn hình. Có thể đặt trong xml bằng thuộc tính app:behavior_peekHeight, hoặc trong code, bằng cách gọi setPeekHeight trên đối tượng BottomSheetBehavior. mbottomSheetBehavior.setPeekHeight(320);
Tạo bottom sheet dạng modal
Bottom sheet modal là bottom sheet dạng hội thoại, không phải là 1 phần của giao diện, có thể được dùng thay thế cho menu hay các dialog đơn giản:
- Tạo 1 lớp mở rộng của BottomSheetDialogFragment, tạo giao diện với layout được sử dụng làm nội dung của modal dialog. layout_custom_bottom_sheet.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<ImageView
android:id="@+id/ic_image"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/margin_normal"
android:layout_marginTop="@dimen/activity_vertical_margin"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello bottom sheet"
android:textSize="@dimen/text_size_medium"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_toRightOf="@+id/ic_image"
android:layout_alignTop="@+id/ic_image"/>
<TextView
android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_below="@+id/ic_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text_lorem_ipsum"
android:lineSpacingExtra="@dimen/margin_small"
android:layout_marginBottom="@dimen/margin_normal"/>
</RelativeLayout>
- Tạo 1 instance của modal bottom sheet và hiển thị nó với phuơng thức show(), truyền vào FragmentManager và 1 chuỗi tag.
CustomBottomSheetDialog bottomSheetDialog = CustomBottomSheetDialog.getInstance();
bottomSheetDialog.show(getSupportFragmentManager(), "Custom Bottom Sheet");
Như vậy ta đã tạo xong bottom sheet cho ứng dụng. Hi vọng bài viết này sẽ có ích cho các bạn
http://www.hidroh.com/2016/06/17/bottom-sheet-everything/?utm_source=androiddevdigest
All rights reserved