设计支持库中的底部表格
底部工作表从屏幕底部向上滑动以显示更多内容。
它们已添加到 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());
你可以在专用主题中找到更多详细信息