Android Cách triển khai Trang dưới cùng từ tài liệu Material Design


79

Làm thế nào để bạn thực hiện suy đoán trang tính dưới cùng? http://www.google.com/design/spec/components/bottom-sheets.html

Bản cập nhật mới cho Google Drive hiển thị điều này bằng cách nhấn vào nút Hành động nổi ->

nhập mô tả hình ảnh ở đây

Được cho là thông số kỹ thuật không bao giờ nói bất cứ điều gì về các góc tròn, bất kể điều đó có thể làm được, chỉ là không chắc chắn về cách thực hiện nó. Hiện đang sử dụng thư viện AppCompat và mục tiêu được đặt thành 21.

Cảm ơn


Liên kết bị hỏng. Liên kết mới material.io/design/components/sheets-bottom.html#usage
Ray Li

Câu trả lời:


66

Biên tập

Các BottomSheethiện là một phần của android-support-library. Hãy xem câu trả lời của John Shelleys .


Thật không may là hiện tại không có cách "chính thức" nào về cách thực hiện việc này (ít nhất là không có cách nào mà tôi biết).
May mắn thay, có một thư viện được gọi là "BottomSheet" (nhấp chuột) bắt chước giao diện BottomSheetvà hỗ trợ Android 2.1 trở lên.

Trong trường hợp của ứng dụng Drive, đây là cách mã sẽ trông như thế nào với thư viện này:

    new BottomSheet.Builder(this, R.style.BottomSheet_Dialog)
            .title("New")
            .grid() // <-- important part
            .sheet(R.menu.menu_bottom_sheet)
            .listener(new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO
        }
    }).show();

menu_bottom_sheet (về cơ bản là tài nguyên /res/menu/*.xml chuẩn)

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/folder"
        android:title="Folder"
        android:icon="@drawable/ic_action_folder" />
    <item
        android:id="@+id/upload"
        android:title="Upload"
        android:icon="@drawable/ic_action_file_upload" />
    <item
        android:id="@+id/scan"
        android:title="Scan"
        android:icon="@drawable/ic_action_camera_alt" />
</menu>

Đầu ra giống như sau:

hình ảnh của tờ dưới cùng

Theo tôi, điều này khá gần với bản gốc. Nếu bạn không hài lòng với màu sắc, bạn có thể tùy chỉnh nó - hãy xem phần này (nhấp vào) .


Bùng nổ. Đây chính xác là những gì tôi đang tìm kiếm! Tôi sẽ thử tối nay!
John Shelley

1
Điều này thật tuyệt, cảm ơn vì đã chia sẻ! Điều gì sẽ xảy ra nếu bạn muốn hiển thị tất cả các tùy chọn sẽ hiển thị trong mục đích chia sẻ? Chúng sẽ được tạo động dựa trên các ứng dụng được cài đặt trên thiết bị. Bất kỳ suy nghĩ về cách có thể được thực hiện?
Cat

1
@Cat Về cơ bản, bạn chỉ cần lấy Danh sách tất cả các ứng dụng có thể xử lý ý định ( ví dụ: xem StackO-Question này ) và thêm chúng vào bộ điều hợp "cung cấp" BottomSheet. Bạn cũng có thể xem mẫu chính thức của lib thực hiện chính xác những gì bạn đang yêu cầu. ( Bấm - Dòng 153 - 179 ).
reVerse

đã hoạt động, cảm ơn @reVerse! Tôi đã kết thúc việc sử dụng lại mã trong getShareActionsphương thức để nhận tất cả các tùy chọn chia sẻ có thể. Btw, cũng hữu ích để gọi .limit(R.integer.num_share_actions)trình xây dựng trừ khi bạn muốn trang tính bao phủ toàn bộ màn hình
Cat

1
@JohnShelley Đúng vậy, hoàn toàn ổn. Tôi cũng khuyên bạn nên sử dụng "giải pháp chính thức" mặc dù nó thực sự hạn chế vào lúc này nhưng cuối cùng thì ít nhất Google cũng đặt nền móng. ;)
reVerse

65

Trả lời câu hỏi của riêng tôi để các nhà phát triển biết rằng cuối cùng thì thư viện hỗ trợ mới cũng cung cấp điều này! Tất cả ca ngợi Google mạnh mẽ!

Một ví dụ từ Blog của nhà phát triển Android :

// The View with the BottomSheetBehavior
View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  
behavior.setBottomSheetCallback(new BottomSheetCallback() {  
   @Override  
   public void onStateChanged(@NonNull View bottomSheet, int newState) {  
     // React to state change  
   }  

  @Override  
  public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
     // React to dragging events  
  }  
});

Câu trả lời của @ reVerse ở trên vẫn là một lựa chọn hợp lệ nhưng thật tuyệt khi biết rằng có một tiêu chuẩn mà Google cũng hỗ trợ.


Cảm ơn vì đăng. Tôi nghĩ đây phải là câu trả lời "Chính xác" ngay bây giờ :)
creep'th

@androiddeveloper xong. coi nó là một thứ hỗ trợ cụ thể bây giờ, tôi cảm thấy người dùng sẽ gặp may mắn hơn khi tìm kiếm những ví dụ đó. Khi tôi hỏi câu hỏi ban đầu, nó không được cung cấp trong lib hỗ trợ. Nếu câu hỏi là "Làm thế nào để triển khai chế độ xem trang dưới cùng của Thư viện hỗ trợ" thì tôi cũng sẽ cung cấp câu trả lời chuyên sâu hơn :)
John Shelley

@JohnShelley Bạn cũng không cần sử dụng một số thứ XML sao? Có thể đặt chế độ xem nhanh / thu gọn trang dưới cùng (hoặc bất cứ điều gì được gọi khi ở dưới cùng) để có chế độ xem bao quát nội dung và khi mở rộng, thành toàn màn hình?
nhà phát triển Android

4
Tôi nghĩ rằng có nhiều người thắc mắc về cách sử dụng API hỗ trợ mới của Google và Vipul Shah có một liên kết YouTube tuyệt vời có thể giúp bạn hiểu cách sử dụng nó, vui lòng tham khảo liên kết YouTube trong stackoverflow.com/a/35731959/1053037
minh truong

câu hỏi vẫn là: làm thế nào để triển khai menu dưới cùng. Các mục menu trong ví dụ trên ở đâu ??????? Bạn biết đấy, các mục menu mà bạn nhấp vào ...
ekashking

8

Theo dõi bài đăng trên blog: http://android-developers.blogspot.com/2016/02/android-support-library-232.html

Xml của tôi cuối cùng trông như thế này:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/coordinator_layout"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <LinearLayout
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="horizontal"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
        <ImageView
            android:src="@android:drawable/ic_input_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

Và trong onCreateView của tôi về phân đoạn của tôi:

    coordinatorLayout = (CoordinatorLayout)v.findViewById(R.id.coordinator_layout);
    View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
    BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
    behavior.setPeekHeight(100);
    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            // React to state change
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            // React to dragging events
        }
    });

Mặc định của setPeekHeight là 0, vì vậy nếu bạn không đặt nó, bạn sẽ không thể nhìn thấy chế độ xem của mình.


Vâng, xml chính xác là cách phân đoạn của tôi trông. Nó không làm việc cho bạn?
mcorrado

Chiều cao cái nhìn mặc định là -1, không 0. (AUTO)
Zordid

1
Nếu bạn sẽ sử dụng AndroidX, hãy lưu ý thay đổi tên gói:com.google.android.material.bottomsheet.BottomSheetBehavior
Ultimo_m 27/02 '19

các món trong thực đơn ở đâu ?????????????????? (toàn bộ điểm của menu trang dưới cùng)
ekashking

7

Bây giờ bạn có thể sử dụng BottomSheetBehaviorAPI chính thức từ thư viện hỗ trợ Android 23.2.

Dưới đây là đoạn mã mẫu

bottomSheetBehavior = BottomSheetBehavior.from(findViewById(R.id.bottomSheet));

case R.id.expandBottomSheetButton:
 bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
 break;
case R.id.collapseBottomSheetButton:
 bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
 break;
case R.id.hideBottomSheetButton:
 bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
 break;
case R.id.showBottomSheetDialogButton:
 new MyBottomSheetDialogFragment().show(getSupportFragmentManager(), "sample");

Vui lòng tham khảo hướng dẫn trên youtube về Android BottomSheet để hiểu về nó.


Chào Vipul, cảm ơn vì liên kết. Tôi có một câu hỏi mặc dù. Có thể đặt điểm neo cho trang tính dưới cùng không?
koraxis

Liên kết youtube tuyệt vời. Bạn có mã nguồn trong repo công khai ở đâu đó không?
John Shelley

một lớn, bạn đã lưu trong ngày của tôi, tôi nghĩ rằng đây câu trả lời nên được chấp nhận
FaisalAhmed

5

Tôi sẽ đi với các góc thẳng như nó nằm trong hướng dẫn. Về phần triển khai - có lẽ tốt nhất là bạn nên sử dụng ý tưởng từ dự án này: https://github.com/umano/AndroidSlidingUpPanel

Tôi nghĩ rằng bạn có thể sử dụng nó như nó vốn có hoặc lấy ý tưởng để thực hiện. Bạn có thể tìm thấy một bài viết tuyệt vời khác về cách triển khai bảng điều khiển trượt tương tự tại đây: http://blog.neteril.org/blog/2013/10/10/framelayout-your-best-ui-friend/


5

Dưới đây là một số tùy chọn khác:

  • Có một cái có sẵn từ Flipboard , tuy nhiên hoạt động nhúng cần được sửa đổi để trang tính dưới hoạt động.
  • tutti-ch của bottomsheet : Điều này đã được chiết xuất từ ResolverActivity Android Repo và các hoạt động phóng không cần phải được sửa đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.