BottomSheetDialog的使用及注意事项

2023-05-16

一、BottomSheetDialog简介

用途:底部弹起的view或dialog。
实现:其关键也是CoordinatorLayout与Behavior
要求: 采用View的形式展示的话,用于展示的View必须具备如下两个要求:
                1,View类必须支持嵌套滚动。
                2,View类必须是CoordinatorLayout的直接子类。

二、简单使用

1、Dialog的形式

   
   
  1. if (mBottomSheetDialog == null){
  2. mBottomSheetDialog = new BottomDialog(that);
  3. View specView = initSpecView();// 这里只是用inflater将一个布局填充为了一View对象
  4. .setContentView(specView);
  5. }
  6. mBottomSheetDialog .show(); // 调用show方法就能展示了
  7. mBottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
  8. @Override
  9. public void onDismiss(DialogInterface dialog) {
  10. mBottomSheetDialog = null;
  11. }
  12. });
  13. private View initSpecView() {
  14. View view = getLayoutInflater().inflate(R.layout.window_goods_choose,null);
  15. ......// 这里就是一些findViewById和对View 进行设置的操作
  16. }

2、View的形式

对于控件的控制和其他CoordinatorLayout的子类一样,通过Beavior来实现
   
   
  1. View bottomSheet = findViewById(R.id.bottom_sheet);//这里需要注意的是:view必须是CoordinatorLayout的子类
  2. behavior = BottomSheetBehavior.from(bottomSheet);//该View需要配置Hehavior属性,Android 的默认实现为:app:layout_behavior="@string/bottom_sheet_behavior"
  3. behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {//设置回调
  4. @Override
  5. public void onStateChanged(@NonNull View bottomSheet, int newState) {
  6. // React to state change
  7. }
  8. @Override
  9. public void onSlide(@NonNull View bottomSheet, float slideOffset) {
  10. // React to dragging events
  11. }
  12. });

3、对状态的控制

通过Beavhior对象调用,setState方法,比如:
   
   
  1. behavior.setState(BottomSheetBehavior.STATE_EXPANDED);// 展开
  2. behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); //关闭
默认Beavhior里面的集中状态介绍:
STATE_COLLAPSED: 收缩,只会在底部显示该layout的一部分。要显示的部分的高度由 pp:behavior_peekHeight属性控制,默认下是0。代码中由BottomSheetBehavior#setPeekHeight()控制。
STATE_DRAGGING: 手指拖动着滑动状态。
STATE_SETTLING: 由用户放开手指到layout最终停止这中间的状态。
STATE_EXPANDED: 完全展开的状态。如果bottom sheet高度过高,则完全展开并可以滑动;否则,就完全展开,并上部留有剩余空间。
STATE_HIDDEN: 隐藏状态。

三、需要注意的问题(遇到的坑)

1、默认打开Dialog的时候,其实Dialog并没有完全打开至 STATE_EXPANDED状态,默认是在 STATE_COLLAPSED的状态,这个对于状态的控制,上述已经有说明,具体根据自己的需求去改变即可
2、通过show()方法展示出来的B ottomSheetDialog,如果用户是通过向下滑动的方式隐藏的话,下次再展示的时候,会发现无法展示了,仅仅背景变暗而已。这个也是由于其状态的问题造成的,因为我们在下滑隐藏 B ottomSheetDialog的时候,其状态变为了 STATE_HIDDEN,但是 其并没有销毁,重新show()的时候,自然也不会重建,但是状态一直处于 STATE_HIDDEN,所以自然就无法展示了。解决方案的话也有两种方式:
(1)每次需要展示的时候,都全部直接重新new一个对象出来
(2)通过反射改变源码,让其每次在show()的时候,将状态改为 STATE_EXPANDED。代码如下:
   
   
  1. import android.content.Context;
  2. import android.os.Build;
  3. import android.os.Bundle;
  4. import android.support.annotation.LayoutRes;
  5. import android.support.annotation.NonNull;
  6. import android.support.annotation.StyleRes;
  7. import android.support.design.widget.BottomSheetBehavior;
  8. import android.support.design.widget.CoordinatorLayout;
  9. import android.support.v7.app.AppCompatDialog;
  10. import android.util.Log;
  11. import android.util.TypedValue;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.view.Window;
  15. import android.widget.FrameLayout;
  16. import java.lang.reflect.Field;
  17. /**
  18. * Base class for {@link android.app.Dialog}s styled as a bottom sheet.
  19. */
  20. public class MyDialog extends AppCompatDialog {
  21. private BottomSheetBehavior bottomSheetBehavior;
  22. public MyDialog(@NonNull Context context) {
  23. this(context, 0);
  24. }
  25. public MyDialog(@NonNull Context context, @StyleRes int theme) {
  26. super(context, getThemeResId(context, theme));
  27. // We hide the title bar for any style configuration. Otherwise, there will be a gap
  28. // above the bottom sheet when it is expanded.
  29. supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
  30. }
  31. protected MyDialog(@NonNull Context context, boolean cancelable,
  32. OnCancelListener cancelListener) {
  33. super(context, cancelable, cancelListener);
  34. supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
  35. }
  36. @Override
  37. public void setContentView(@LayoutRes int layoutResId) {
  38. super.setContentView(wrapInBottomSheet(layoutResId, null, null));
  39. }
  40. @Override
  41. protected void onCreate(Bundle savedInstanceState) {
  42. super.onCreate(savedInstanceState);
  43. getWindow().setLayout(
  44. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
  45. }
  46. @Override
  47. public void setContentView(View view) {
  48. super.setContentView(wrapInBottomSheet(0, view, null));
  49. }
  50. @Override
  51. public void setContentView(View view, ViewGroup.LayoutParams params) {
  52. super.setContentView(wrapInBottomSheet(0, view, params));
  53. }
  54. private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) {
  55. final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(),
  56. android.support.design.R.layout.design_bottom_sheet_dialog, null);
  57. if (layoutResId != 0 && view == null) {
  58. view = getLayoutInflater().inflate(layoutResId, coordinator, false);
  59. }
  60. FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(android.support.design.R.id.design_bottom_sheet);
  61. bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
  62. bottomSheetBehavior.setBottomSheetCallback(mBottomSheetCallback);
  63. if (params == null) {
  64. bottomSheet.addView(view);
  65. } else {
  66. bottomSheet.addView(view, params);
  67. }
  68. // We treat the CoordinatorLayout as outside the dialog though it is technically inside
  69. if (shouldWindowCloseOnTouchOutside()) {
  70. coordinator.findViewById(android.support.design.R.id.touch_outside).setOnClickListener(
  71. new View.OnClickListener() {
  72. @Override
  73. public void onClick(View view) {
  74. if (isShowing()) {
  75. cancel();
  76. }
  77. }
  78. });
  79. }
  80. return coordinator;
  81. }
  82. private boolean shouldWindowCloseOnTouchOutside() {
  83. if (Build.VERSION.SDK_INT < 11) {
  84. return true;
  85. }
  86. TypedValue value = new TypedValue();
  87. //noinspection SimplifiableIfStatement
  88. if (getContext().getTheme()
  89. .resolveAttribute(android.R.attr.windowCloseOnTouchOutside, value, true)) {
  90. return value.data != 0;
  91. }
  92. return false;
  93. }
  94. private static int getThemeResId(Context context, int themeId) {
  95. if (themeId == 0) {
  96. // If the provided theme is 0, then retrieve the dialogTheme from our theme
  97. TypedValue outValue = new TypedValue();
  98. if (context.getTheme().resolveAttribute(
  99. android.support.design.R.attr.bottomSheetDialogTheme, outValue, true)) {
  100. themeId = outValue.resourceId;
  101. } else {
  102. // bottomSheetDialogTheme is not provided; we default to our light theme
  103. themeId = android.support.design.R.style.Theme_Design_Light_BottomSheetDialog;
  104. }
  105. }
  106. return themeId;
  107. }
  108. private BottomSheetBehavior.BottomSheetCallback mBottomSheetCallback
  109. = new BottomSheetBehavior.BottomSheetCallback() {
  110. @Override
  111. public void onStateChanged(@NonNull View bottomSheet,
  112. @BottomSheetBehavior.State int newState) {
  113. if (newState == BottomSheetBehavior.STATE_HIDDEN) {
  114. dismiss();
  115. }
  116. }
  117. @Override
  118. public void onSlide(@NonNull View bottomSheet, float slideOffset) {
  119. }
  120. };
  121. @Override
  122. protected void onStart() {
  123. super.onStart();
  124. // 会有异常
  125. // if (bottomSheetBehavior != null)
  126. // bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
  127. //暂时解决方法
  128. try {
  129. Field field = BottomSheetBehavior.class.getDeclaredField("mState");
  130. field.setAccessible(true);
  131. field.setInt(bottomSheetBehavior, BottomSheetBehavior.STATE_EXPANDED);
  132. } catch (NoSuchFieldException e) {
  133. Log.e("BottomSheetBehavior", "Error setting BottomSheetBehavior initial state (1)", e);
  134. } catch (IllegalAccessException e) {
  135. Log.e("BottomSheetBehavior", "Error setting BottomSheetBehavior initial state (2)", e);
  136. }
  137. }
  138. }
该种实现方式转自:http://blog.csdn.net/sunshine2050_csdn/article/details/50818197,非常感谢其贡献。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BottomSheetDialog的使用及注意事项 的相关文章

  • 【STM32F0】Keil 查看局部变量显示<not in scope>

    现象 xff1a 在进行STM32F0开发的时候出现了 调试代码 xff0c 添加变量Watch时 xff0c 显示not in scope 处理方式 xff1a 因为代码开了优化的处理 xff0c 把优化改到Level0 就可以解决问题
  • error: undefined reference to '__dso_handle'解决方案

    error undefined reference to 39 dso handle 39 解决方案 home NDK android ndk r9 sources cxx stl gnu libstdc 43 43 4 7 libs ar
  • ARM里的大端格式和小端格式分别是什么意思?

    当前的存储器 xff0c 多以byte为访问的最小单元 xff0c 当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题 于是端 endian 的问题应运而生了 对于不同的存储方法 就有大端 big endian 和小端
  • STM32串口通信(基于缓冲区)编程及遇到的问题总结

    在写串口通信前阅读了STM32中文参考手册 xff0c 然后满心澎湃地写代码 在这个过程中遇一些让人郁闷的事情 xff0c 目前这些问题目前已经解决了 xff08 嘿嘿嘿 xff09 xff0c 特此来总结一番 串口的使用步骤大概如下 xf
  • 主板串口FIFO大小设置

    FIFO大小和芯片 驱动有关系 xff0c 可以在设备管理器里面调整大小 1 进入设备管理器 xff0c 右键选择串口属性 2 在端口设置里面选择高级 3 可以单独设定每一个串口的接收和发送区大小
  • mac终端 python scrapy爬虫 zsh: no matches found

    在学习Python爬虫时 xff0c 进行到scrapy板块 xff0c 执行genspider命令 输入scrapy genspider tongcheng https bj 58 com sou key 61 E5 89 8D E7 A
  • JSESSIONID的简单说明

    1 第一次访问服务器的时候 xff0c 会在响应头里面看到Set Cookie信息 只有在首次访问服务器的时候才会在响应头中出现该信息 上面的图JSESSIONID 61 ghco9xdnaco31gmafukxchph Path 61 a
  • 史上最全的常用开发工具类收集(持续更新中)

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img BtY85pbk 1577412535564 https img shields io badge QQ群 523167548 20 ff69b4 svg API
  • MFC学习之vc通过HTTP请求:Get或Post方式获取JSON信息(亲测可用)

    前段时间公司项目需要跟上一级平台对接一些采集回来的数据 xff0c 通过HTTP xff0c post方法上传JSON信息到指定的接口地址 本来呢 xff1f 我在入职时是面试的售后岗 xff0c 一家小公司 xff0c 当时公司软件方面一
  • mac安装虚拟机VMware fusion12 和ubantu系统

    一 基本安装 下载虚拟机VMware fusion12 我选择了不更新新版本并且允许访问辅助功能 选择 新建 接下来选择 从光盘或者映像安装 从下载目录把ubantu系统拖拽过去 点击安装完成 xff0c 将ubantu系统保存在虚拟机上即
  • VSCode常用命令---记录自己的常用命令

    一 nvm相关命令 node版本管理 查看已安装的版本 nvm list 使用版本 nvm use 版本号 安装版本 nvm install 版本号 卸载版本 nvm uninstall 版本号 常用命令 全局包安装 多用于gitee下载后
  • Ubuntu18.04 Realsense D435i驱动安装与配置

    InterRealSenseD435i SDK安装 一 命令行的安装方式安装 1 注册服务器的公钥 xff1a 打开终端输入 sudo apt key adv keyserver keys gnupg net recv key C8B3A5
  • Qt上位机:与STM32串口通信,数据收发,按钮控制LED

    Qt学习了几周 xff0c 做一个串口助手巩固一下最近学习的内容 遇到的问题1 xff1a write函数只能发送一次数据 xff0c 想要继续发送必须重新关闭打开串口 xff0c 每次只能发送一次数据 解决办法 xff1a 在网上找不到类
  • 考研数据结构2 | 使用 C++ 实现顺序栈 | 栈的基本应用之计算后缀表达式

    文章目录 1 顺序栈 简介2 顺序栈 代码实现3 栈的应用之计算后缀表达式3 1 表达式介绍3 2 计算后缀表达式的实现3 3 完整代码3 4 LeetCode 提交代码 1 顺序栈 简介 在上一次的学习中 xff0c 使用指针实现了链栈
  • C++使用libcurl做HttpClient

    C 43 43 使用libcurl做HttpClient 分类 xff1a 基础技术分享 2012 06 14 19 25 1469人阅读 评论 3 收藏 举报 当使用C 43 43 做HTTP客户端时 xff0c 目前通用的做法就是使用l
  • CAN的报文格式

    CAN的报文格式 在总线中传送的报文 xff0c 每帧由7部分组成 CAN协议支持两种报文格式 xff0c 其唯一的不同是标识符 xff08 ID xff09 长度不同 xff0c 标准格式为11位 xff0c 扩展格式为29位 在标准格式
  • uabntu系统安装软件:E: 无法定位软件包问题

    血泪教训 耽误了贼长时间 一开始参考了如下链接 xff0c 然而我的问题一个没解决 xff0c 哭了 Ubuntu sudo apt get install 出现 E 无法定位软件包问题 解决方法汇总 遥想在想peach的博客 CSDN博客
  • 右手定则

    http www 7wenta com zhuanti 9648 html 问他 首页问答中心竞技场 学习快报 达人榜商城 问他手机版 注册 登录 问他网 gt 学习专题 gt 高中物理 gt 右手定则 物理题库练习题我要提问

随机推荐

  • 【机器人规划】Bug解析

    文章目录 参考文献简介Bug1算法Bug2算法Tangent Bug算法关于O i的选择激光雷达半径对算法的影响 总结 参考文献 自动驾驶决策规划算法 Bug Algorithms Bug算法 Robotic Motion Planning
  • ubantu虚拟机无法联网

    在VMware中安装Ubuntu虚拟机 xff0c 总会发生无法上网的情况 xff0c 主要情况有以下几点 xff1a 宿主机可以上网 xff1b 虚拟机却无法访问网页虚拟机ping不通任何网站 xff0c 用浏览器显示error 一般情况
  • 半监督语义分割论文学习记录

    Semi Supervised Semantic Segmentation with Cross Consistency Training 1 1 motivation 一致性训练的目的是在应用于输入的小扰动上增强模型预测的不变性 因此 x
  • 使用Qt二次开发周立功CAN(一)

    使用Qt二次开发周立功CAN xff08 一 xff09 使用Qt二次开发周立功的CAN通信 xff0c 第一步需要完成动态链接库的加载 xff0c 成功加载之后才能调用其提供的接口函数 加载库需要注意的问题有两个 xff1a 一是Qt版本
  • 字节序基础知识

    在各种计算机体系结构中 xff0c 对于字节 字等的存储机制有所不同 xff0c 因而引发了计算机通信领 域中一个很重要的问题 xff0c 即通信双方交流的信息单元 xff08 比特 字节 字 双字等等 xff09 应该以什么样的顺序进行传
  • vlc命令行: 转码 流化 推流

    写在命令行之前的话 xff1a VLC不仅仅可以通过界面进行播放 xff0c 转码 xff0c 流化 xff0c 也可以通过命令行进行播放 xff0c 转码和流化 还可以利用里面的SDK进行二次开发 vlc命令行使用方法 xff1a 1 x
  • C++ 简单实现HTTP GET/POST 请求

    HTTP 超文本传输协议 是一种客户端与服务端的传输协议 xff0c 最早用于浏览器和服务器之间的通信 xff0c 后来因为其使用灵活 方便等特点 xff0c 广泛用于客户端与服务端的通信 文章将简单介绍HTTP协议 xff0c 同时以C
  • STM32单片机HAL库下串口接收不定长数据

    xff33 xff34 xff2d xff13 xff12 单片机 xff28 xff21 xff2c 库下串口接收不定长数据 xff28 xff21 xff2c 库下的串口接收不定长数据代码配置代码实现代码演示总结 xff28 xff21
  • C++将一个数据格式化为固定长度的字符串

    经常会遇到将数据解析为文本文件的现象 xff0c 通常因为数据长度的不同导致 xff0c 可视化效果不好 写一个输入数据获取固定长度字符串的函数 xff0c 来得到一个固定长度的数据 xff0c 让格式化看起来好看一些 include lt
  • Socket原理与编程基础

    一 Socket简介 Socket是进程通讯的一种方式 xff0c 即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换 几个定义 xff1a xff08 1 xff09 IP地址 xff1a 即依照TCP IP协议分
  • mac 安装brew

    起因是这样的 xff0c 我想在mac上安装htop 然后我了解到可以用brew安装htop 然后再执行命令 brew install htop 所以我就开始吭哧吭哧安装brew 过程xue wei 曲折了一些 先是看到一个文章 xff0c
  • 【项目学习】C++实现高并发服务器——代码学习(三)用户注册登录功能

    项目来源 xff1a WebServer 上一篇 xff1a 存储解析HTTP请求报文 xff0c 创建响应报文 本文介绍以下功能的代码实现 利用RAII机制实现了数据库连接池 xff0c 减少数据库连接建立与关闭的开销 xff0c 同时实
  • 用CSS3实现动画进度条

    CSS3的新特性为我们实现漂亮的进度条扫清了障碍 xff0c 我们可以完全不需要任何图片和简单的Javascript代码就可以构建 一 第一个例子 效果图 xff1a Demo地址 xff1a http namepk sinaapp com
  • tcpdump命令使用详解

    tcpdump命令使用详解 疯狂的小企鹅的博客 CSDN博客 tcpdump命令详解全网最详细的 tcpdump 使用指南 王一白 博客园Tcpdump抓包工具实战教程 xff0c 让你知道一个抓包走天下 xff01 哔哩哔哩 bilibi
  • Chrome浏览器Postman插件安装包及安装教程

    最近电脑装了新环境 xff0c 以前本地的postman安装包竟然找不到了 xff0c 网上费尽心力找了很多资源 xff0c 终于找到纯净的安装包 xff0c 绕开套路 xff0c 现将Postman安装包及安装教程分享给各位 xff0c
  • LayoutInflater的错误用法(Avoid passing null as the view root )

    今天在练习使用Fragment的时候 xff0c 注意到在使用LayoutInflater的时候有黄色报警 xff08 Avoid passing null as the view root needed to resolve layout
  • Android M(6.0)运行时权限申请及遇到的坑

    一 概述 在对动态权限申请进行详细说明时 xff0c 还是先大致介绍下6 0后 xff0c google对权限的一个归类和划分 在Android M之前 xff0c 再开发应用的时候 xff0c 程序员只需要在AndroidManifest
  • Android DataBinding介绍(一)——简介、数据及方法事件绑定

    简介 Data binding 是Google在2015年7月发布的Android Studio v1 3 0 版本上引入的 xff0c 在2016年4月Android Studio v2 0 0 上正式支持 引入之初 xff0c 不支持双
  • CoordinatorLayout的使用(一)——简单使用

    简介 CoordinatorLayout是Android support design推出的新布局 xff0c 主要用于作为视图根布局以及协调子控件的行为 xff08 根据用户的触摸行为产生一定的动画效果 xff09 主要是通过设置子Vie
  • BottomSheetDialog的使用及注意事项

    一 BottomSheetDialog简介 用途 xff1a 底部弹起的view或dialog 实现 xff1a 其关键也是CoordinatorLayout与Behavior 要求 xff1a 采用View的形式展示的话 xff0c 用于