Android学习之BottomSheetDialog组件的使用


Posted in Java/Android onJune 21, 2022

基本介绍

BottomSheetDialog是底部操作控件,可在屏幕底部创建一个支持滑动关闭视图。

目前依赖使用如下:

implementation 'com.google.android.material:material:1.4.0'

基础使用

BottomSheetDialog需要为它添加视图内容,类似Dialog,且BottomSheetDialog的高度由自定义视图决定。

var text = TextView(this@UIBottomSheetAC)
         text.text = "BottomSheetDialog"
         var linearLayout = LinearLayout(this@UIBottomSheetAC)
         linearLayout.addView(text)
         linearLayout.setBackgroundColor(Color.YELLOW)
         linearLayout.layoutParams = LinearLayout.LayoutParams(-1,500)
         val bottomSheetDialog =
             BottomSheetDialog(context, R.style.bottom_sheet_dialog)
         bottomSheetDialog.setContentView(linearLayout)
         bottomSheetDialog.show()

其他功能实现

圆角样式实现

BottomSheetDialog官方默认样式是矩形弹窗并不带圆角设置。但在日常开发中会遇到需要圆角弹窗设计要求需要对BottomSheetDialog默认样式做一些调整才能实现。

BottomSheetDialog样式文件

<style name="bottom_sheet_dialog" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/bottom_sheet_style_wrapper</item>
</style>
<style name="bottom_sheet_style_wrapper" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@android:color/transparent</item>
</style>

布局背景圆角

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/holo_blue_light" />
    <corners
        android:topLeftRadius="15dp"
        android:topRightRadius="15dp" />
</shape>

代码配置

// 视图背景增加圆角样式
linearLayout.background = getDrawable(R.drawable.ui_shape_top_radius15)
// bottomSheetDialog设置透明背景样式
val bottomSheetDialog =
    BottomSheetDialog(context, R.style.bottom_sheet_dialog)

Android学习之BottomSheetDialog组件的使用

去弹窗外部遮罩阴影

增加android:backgroundDimEnabled属性为false实现无背景阴影遮罩效果。

<style name="bottom_sheet_dialog" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/bottom_sheet_style_wrapper</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

Android学习之BottomSheetDialog组件的使用

带阴影

Android学习之BottomSheetDialog组件的使用

不带阴影

关闭触发设置

  • 是否支持拖拽关闭通过设置setCancelable方法实现。
  • 是否支持点击视图外部关闭弹窗通过setCanceledOnTouchOutside方法实现
bottomSheetDialog.setCancelable(false)
bottomSheetDialog.setCanceledOnTouchOutside(true)

列表视图使用

使用列表功能也是可以直接实现,添加ListView即可,列表高度可设置ViewGroup.LayoutParams实现(默认情况下若列表数据较多会撑满整个屏幕)。

Button(this).run {
    it.addView(this)
    text = "BottomSheetListDialog"
    setOnClickListener {
        var listView = ListView(this@UIBottomSheetAC)
        listView.adapter =
            ArrayAdapter<String>(
                this@UIBottomSheetAC,
                android.R.layout.simple_list_item_1,
                values
            )
        var coordinatorLayout = CoordinatorLayout(this@UIBottomSheetAC)
        val params = ViewGroup.LayoutParams(
            resources.displayMetrics.widthPixels,
            resources.displayMetrics.heightPixels
        )
        coordinatorLayout.addView(listView)
        val bottomSheetDialog =
            BottomSheetDialog(context, R.style.bottom_sheet_dialog)
        bottomSheetDialog.setContentView(coordinatorLayout,params)
        bottomSheetDialog.show()
    }
}

但使用BottomSheetBehavior要求根布局必须是CoordinatorLayout否则会报错。

Android学习之BottomSheetDialog组件的使用

val bottomSheetBehavior = BottomSheetBehavior.from(coordinatorLayout)
        bottomSheetBehavior.peekHeight = resources.displayMetrics.heightPixels * 3 / 4
        bottomSheetBehavior.addBottomSheetCallback(object :
            BottomSheetBehavior.BottomSheetCallback() {
            override fun onSlide(bottomSheet: View, slideOffset: Float) {

            }

            override fun onStateChanged(bottomSheet: View, newState: Int) {
                if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                    bottomSheetDialog.dismiss()
                }
            }
        })

到此这篇关于Android学习之BottomSheetDialog组件的使用的文章就介绍到这了,更多相关Android BottomSheetDialog内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
Java方法重载和方法重写的区别到底在哪?
Jun 11 Java/Android
详解Java实现数据结构之并查集
Jun 23 Java/Android
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
Mar 17 Java/Android
springboot入门 之profile设置方式
Apr 04 Java/Android
Java Lambda表达式常用的函数式接口
Apr 07 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
Android中View.post和Handler.post的关系
Jun 05 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
httpclient调用远程接口的方法
Aug 14 Java/Android
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
Jun 21 #Java/Android
Mybatis-plus配置分页插件返回统一结果集
SpringCloud超详细讲解Feign声明式服务调用
Jun 21 #Java/Android
使用Postman测试需要授权的接口问题
Jun 21 #Java/Android
springboot集成redis存对象乱码的问题及解决
Jun 16 #Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 #Java/Android
Java中的Kotlin 内部类原理
Jun 16 #Java/Android
You might like
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
网页javascript精华代码集
2007/01/24 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
小程序点击图片实现png转jpg
2019/10/22 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python中map和列表推导效率比较实例分析
2015/06/17 Python
八大排序算法的Python实现
2021/01/28 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
python 读入多行数据的实例
2018/04/19 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
应届生保险求职信
2013/11/11 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
冰雪公主观后感
2015/06/16 职场文书
2015年暑假工作总结
2015/07/13 职场文书