Support Design库中的BottomSheetDialog组件使用

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:22   2023   0

首先来看这个组件使用的经典案例,微信公众号文章操作功能显示:


首先要知道BottomSheetDialog有两种,第一种弹出后不影响主界面交互,第二种弹出后主界面变暗不能交互,这里分别进行使用。

1.首先是普通的BottomSheetDialog:

(1)实现

使用方法是Behavier和CoordingLayout相结合。就像悬浮按钮和ToolBar等一样,这个组件要作为CoordingLayout的直接子组件并且通过设置behavior属性来告知Behavior他想要的特性。BottomSheetDialog没有具体的组件标签,所以这里直接将一个布局文件作为CoordingLayout的子组件:

<include android:id="@+id/sheet"
        layout="@layout/bottom_sheet"/>


然后看这个布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:behavior_hideable="true"
    app:behavior_peekHeight="0dp"
    app:layout_behavior="@string/bottom_sheet_behavior">
    <View
        android:background="#f00"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
    <View
        android:background="#0f0"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
    <View
        android:background="#00f"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
</LinearLayout>
重点就是几个app属性了,behavior就是核心属性了,告知自己是BottomSheet。

这里高度设置不要设置为match_parent,它不像列表的子组件布局一样能够自动调整为自适应。因为父布局CoordingLayout其实是一个FrameLayout,所以如果用match的话确实会铺满布局。

还有位置问题,因为我们想要让他在底部显示,所以这里要把layout_gravity设置为底部,默认是不会定位到底部的。

peekHeight:折叠后剩余的高度,虽然我看有一篇文档上说默认是0,但是如果我在这里不设置的话会出现控制它折叠无效果的情况。(有大神能解答一下?)

还有一个重要的属性hideable,默认是false,表示是否能够控制隐藏。只有设置为真后才能通过代码或者滑动控制折叠。


(2)state:如何对他的状态进行操作:

behavior=BottomSheetBehavior.from(findViewById(R.id.sheet));
        behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);

如上,是通过BotomSheetBehavior对象实现的,当然也可以通过getState获取状态。BottomSheetDialog有这样几种状态:

  • STATE_COLLAPSED: 默认的折叠状态

  • STATE_DRAGGING : 过渡状态,此时用户正在向上或者向下拖动bottom sheet

  • STATE_SETTLING: 视图从脱离手指自由滑动到最终停下的这一小段时间

  • STATE_EXPANDED: bottom sheet 处于完全展开的状态

  • STATE_HIDDEN : 默认无此状态(可通过app:behavior_hideable 启用此状态),启用后用户将能通过向下滑动完全隐藏 bottom sheet



2.BottomSheetDialogFragment:

很明显微信的那个效果就是这一种了,弹出后主界面变暗,点击灰色部分底部栏消失(或者通过滑动)。

这种使用起来非常简单,也不需要依赖CoordingLayout了,首先先写一个布局文件(不需要给出behavior属性),然后写一个类继承BottomSheetDialogFragment并加载布局文件:

public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.bottom2,null);
        return view;
    }
}

然后想使用的时候实例化这个类并调用show就可以了:

fragment=new CustomBottomSheetDialogFragment();
fragment.show(getSupportFragmentManager(),"dialog");


而且这个对象只有两个状态,就是弹出和隐藏。




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP