MaterialDesign系列文章(十五)BottomSheet的使用

不怕跌倒,所以飞翔

不多说了,开始我们今天的内容吧!今天介绍一下5.0新出的一个控件,这个控件的作用呢就是从底部弹出一个对话框,有点和照片选择的对话框类似,但是写法上呢就和对话框有很大的区别了。

其实BottomSheet是根据CoordinatorLayout基础上实现的,基本上都是依据layout_behavior进行实现的,这里不准备讲关于自定义behavior的实现,这里只是讲BottomSheet的behavior使用.

主要包括的内容:

  • BottomSheet
  • BottomSheetDialog
  • BottomSheetDialogFragment

BottomSheet简单的使用:

1.在布局中使用BottomSheet

说下可以使用的XML属性

  • app:behavior_peekHeight 当Bottom Sheets关闭的时候,底部我们能看到的高度,默认是0不可见。
  • app:behavior_hideable 是当我们拖拽下拉的时候,bottom sheet是否能全部隐藏。
    -app:layout_behavior="@string/bottom_sheet_behavior" 这个是使用BottomSheet所必须的

这里贴一下XML文件:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hejin.materialdesign.activity.BottomSheetActivity">


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="展示"/>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:behavior_hideable="false"
        app:behavior_peekHeight="50dp"
        app:layout_behavior="@string/bottom_sheet_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#333444"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:gravity="center"
                android:text="hehe"/>
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

这里我一直有一个疑问,为什么上面的布局的LinearLayout当我设置成具体高度的时候BottomSheet总是显示不出来???还请知道的在这里留个言,先谢谢了!

这里其实很简单,就是你自己些一个布局,然后在布局添加一个app:layout_behavior="@string/bottom_sheet_behavior"就可以使这个控件能从底部出来了,如果这个控件足够大的话,还能填满全屏.但是这里zhu

2.在代码中控制BottomSheet

2.1BottomSheetBehavior的几种状态说明:

  • STATE_DRAGGING 过渡状态,此时用户正在向上或者向下拖动bottom sheet
  • STATE_SETTLING 视图从脱离手指自由滑动到最终停下的这一小段时间
  • STATE_EXPANDED bottom sheet 处于完全展开的状态:当bottom sheet的高度低于CoordinatorLayout容器时,整个bottom sheet都可见;或者CoordinatorLayout容器已经被bottom sheet填满。
  • STATE_COLLAPSED 默认的折叠状态, bottom sheets只在底部显示一部分布局。显示高度可以通过 app:behavior_peekHeight 设置(默认是0)
  • STATE_HIDDEN 默认无此状态(可通过app:behavior_hideable 启用此状态),启用后用户将能通过向下滑动完全隐藏 bottomSheet
        /*当为折叠状态或者是打开状态的话就隐藏视图*/
        if (mEasySheet.getState() == BottomSheetBehavior.STATE_HIDDEN) {
            mEasySheet.setState(BottomSheetBehavior.STATE_COLLAPSED);
        } else if (mEasySheet.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
            mEasySheet.setState(BottomSheetBehavior.STATE_EXPANDED);
        }

这里说下我踩的坑:

  1. 这个里面没有关闭状态,只有一个折叠状态,但是看好啊这个是折叠的状态,只有当你把折叠状态设置成0的时候才能完全关闭底部的BottomSheet,否则会显示你peek设置的高度,只有你手指下滑的时候才能关闭它.
    2.STATE_HIDDEN 这个状态只有设置了app:behavior_hideable为true的时候才能向下滑动的时候完全隐藏bottomSheet这里一定要注意.

3.setBottomSheetCallback监听

        BottomSheetBehavio.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                /*状态改变的监听*/
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                /*当底部的BottomSheet被拖动的时候回调*/
            }
        });

BottomSheetDialog的使用

1.简单的使用

  • 首先要写一个xml的布局,这个布局可以不被CooordinatorLayout包裹,但是还是推荐使用滑动控件NestedScrillView
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="@color/colorPrimary"
            android:gravity="center"
            android:onClick="doclick"
            android:text="啦啦啦啦啦啦啦啦啦"
            android:textColor="@color/white"
            android:textSize="18sp"/>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="doclick"
            android:scaleType="centerCrop"
            android:src="@mipmap/photo"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

这里说明一下就是,如果你弹出的Dialog布局比较大都得话,会和你设置peek的高度似的,不会全部显示,但是你要是上滑的时候就会完全显示出来...

  • 展示对话框
        BottomSheetDialog sheetDialog = new BottomSheetDialog(this);
        sheetDialog.setContentView(R.layout.sheet_dialog);
        sheetDialog.show();

剩下的和Dialog的使用都差不多...

BottomSheetDialogFragment的使用

BottomSheetDialogFragment可以帮助我们实现全屏的BottomSheet展示效果。新建一个类继承BottomSheetDialogFragment

xml使用BottomSheetDialog的布局样式,我们直接看java代码

public class FullSheetDialogFragment extends BottomSheetDialogFragment {
    private BottomSheetBehavior mBehavior;
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
        View view = View.inflate(getContext(), R.layout.dialog_bottom_sheet, null);
        dialog.setContentView(view);
        mBehavior = BottomSheetBehavior.from((View) view.getParent());
        return dialog;
    }

    @Override
    public void onStart()
    {
        super.onStart();
        //默认全屏展开
        mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

    public void doclick(View v)
    {
        //点击任意布局关闭
        mBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    }
}

调用BottomSheetDialogFragment展示

new FullSheetDialogFragment().show(getSupportFragmentManager(), "dialog");

BottomSheetDialogFragment的效果跟BottomSheetDialog差不多,根据情况选择。但是我觉得这个写着比较费劲,感觉还是Dialog比较好!!!


这一系列文章的地址,希望对大家有帮助

项目地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容