設計支援庫中的底部表格

底部工作表從螢幕底部向上滑動以顯示更多內容。
它們已新增到 v.25.1.0 版本的 Android 支援庫中,並支援上述所有版本。

確保在依賴項下的應用程式的 build.gradle 檔案中新增了以下依賴項:

 compile 'com.android.support:design:25.3.1'

持久的底部表格

你可以實現一個持久的底部工作表BottomSheetBehavior附加到一個子檢視 CoordinatorLayout

<android.support.design.widget.CoordinatorLayout >

    <!-- .....   -->

    <LinearLayout
       android:id="@+id/bottom_sheet"
       android:elevation="4dp"
       android:minHeight="120dp"
       app:behavior_peekHeight="120dp"
       ...
       app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

           <!-- .....   -->

       </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

然後在你的程式碼中,你可以使用以下命令建立引用

 // The View with the BottomSheetBehavior  
 View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
 BottomSheetBehavior mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);  

你可以使用 setState() 方法設定 BottomSheetBehavior 的狀態 :

mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);

你可以使用以下狀態之一:

  • STATE_COLLAPSED :此摺疊狀態是預設狀態,僅顯示底部佈局的一部分。可以使用 app:behavior_peekHeight 屬性控制高度(預設為 0)

  • STATE_EXPANDED底板的完全展開狀態,其中整個底板是可見的(如果它的高度小於包含的 CoordinatorLayout)或整個 CoordinatorLayout 被填充

  • STATE_HIDDEN :預設情況下禁用(並使用 app:behavior_hideable 屬性啟用),啟用此選項允許使用者向下滑動底部工作表以完全隱藏底部工作表

進一步開啟或關閉 BottomSheet,單擊你選擇的檢視,按一下按鈕,這裡是如何切換工作表行為和更新檢視。

mButton = (Button) findViewById(R.id.button_2);
    //On Button click we monitor the state of the sheet
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
                //If expanded then collapse it (setting in Peek mode).
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                mButton.setText(R.string.button2_hide);
            } else if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
                //If Collapsed then hide it completely.
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
                mButton.setText(R.string.button2);
            } else if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
                //If hidden then Collapse or Expand, as the need be.
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                mButton.setText(R.string.button2_peek);
            }
        }
    });

但是 BottomSheet 行為還具有以下功能:使用者可以通過 DRAG 動作與向上滑動或向下滑動進行互動。在這種情況下,我們可能無法更新從屬檢視(如上面的按鈕)如果 Sheet 狀態已更改。就此而言,你希望收到狀態更改的回撥,因此你可以新增 BottomSheetCallback 來收聽使用者滑動事件:

mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetCallback() {  
    @Override  
    public void onStateChanged(@NonNull View bottomSheet, int newState) {  
      // React to state change and notify views of the current state
    }  
      @Override  
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
       // React to dragging events and animate views or transparency of dependent views
   }  
 });  

如果你只希望底部工作表僅在 COLLAPSED 和 EXPANDED 模式下可見,則切換並且永遠不會使用:

mBottomSheetBehavior2.setHideable(false);

底部表格 DialogFragment

你還可以在底部工作表中顯示 BottomSheetDialogFragment 來代替 View。為此,首先需要建立一個擴充套件 BottomSheetDialogFragment 的新類。

setupDialog() 方法中,你可以膨脹新的佈局檔案並檢索 Activity 中容器檢視的 BottomSheetBehavior。一旦有了這種行為,就可以建立 BottomSheetCallback 並將其關聯,以便在隱藏工作表時關閉 Fragment。

public class BottomSheetDialogFragmentExample extends BottomSheetDialogFragment {
 
    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
 
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss();
            }
 
        }
 
        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    };
 
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View contentView = View.inflate(getContext(), R.layout.fragment_bottom_sheet, null);
        dialog.setContentView(contentView);
 
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
        CoordinatorLayout.Behavior behavior = params.getBehavior();
 
        if( behavior != null && behavior instanceof BottomSheetBehavior ) {
            ((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
        }
    }
}

最後,你可以在 Fragment 的例項上呼叫 show() 以在底部工作表中顯示它。

BottomSheetDialogFragment bottomSheetDialogFragment = new BottomSheetDialogFragmentExample();
bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag());

你可以在專用主題中找到更多詳細資訊