当前位置: 首页 > article >正文

【Android】BottomSheet基本用法总结(BottomSheetDialog,BottomSheetDialogFragment)

BottomSheet

BottomSheet 是一种位于屏幕底部的面板,用于显示附加内容或选项。提供了从屏幕底部向上滑动显示内容的交互方式。这种设计模式在 Material Design 中被广泛推荐,因为它可以提供一种优雅且不干扰主屏幕内容的方式来展示额外信息或操作。

具体实现主要包含:BottomSheetBeahvior 、BottomSheetDialog、BottomSheetDialogFragment

m3-bottom-sheet

BottomSheetBehavior

用于控制布局(通常是 CoordinatorLayout 下的子布局)行为的类,它允许布局像 Bottom Sheet 一样从屏幕底部滑出或隐藏。

可以通过 BottomSheetBehavior 实现一个嵌入式 Bottom Sheet,它是屏幕内容的一部分,而不是弹出式对话框。可以控制 Bottom Sheet 的各种状态,比如展开、折叠、隐藏等。

步骤

  1. 导入依赖

        implementation 'com.google.android.material:material:1.9.0'
    
  2. 设置布局文件

    需要在布局文件中定义一个作为 Bottom SheetView,通常是 FrameLayout 或其他可容纳内容的容器,并确保该容器是在 CoordinatorLayout 之下。

    注意要添加app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">


    <androidx.core.widget.NestedScrollView
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@android:color/holo_orange_light"
        android:clipToPadding="true"
        app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="16dp"
            android:text="你好"
            android:textSize="16sp" />

    </androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
  1. 在代码中获取BottomSheetBehavior
public class MainActivity extends AppCompatActivity {
    
    private BottomSheetBehavior mBottomSheetBehavior;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View bottomSheet = findViewById(R.id.bottom_sheet);

        mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
        mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }
}

BottomSheetBehavior 有多种状态,你可以通过 setState() 方法来控制它的状态:

  • STATE_EXPANDED:完全展开状态。
  • STATE_COLLAPSED:折叠状态。
  • STATE_HIDDEN:隐藏状态(需要启用)。
  • STATE_DRAGGING:正在拖动(通常是用户手势触发)。
  • STATE_SETTLING:松手后即将到达某个状态。
  1. 设置 BottomSheetBehavior 的回调

    可以通过设置 BottomSheetCallback 来监听 Bottom Sheet 状态的变化或滑动事件:

    bottomSheetBehavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            switch (newState) {
                case BottomSheetBehavior.STATE_EXPANDED:
                    Toast.makeText(MainActivity.this, "Bottom Sheet Expanded", Toast.LENGTH_SHORT).show();
                    break;
                case BottomSheetBehavior.STATE_COLLAPSED:
                    Toast.makeText(MainActivity.this, "Bottom Sheet Collapsed", Toast.LENGTH_SHORT).show();
                    break;
                case BottomSheetBehavior.STATE_HIDDEN:
                    Toast.makeText(MainActivity.this, "Bottom Sheet Hidden", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    
        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            // 处理滑动事件
        }
    });
    

BottomSheetDialog

一个 Dialog 类型的组件,用于创建一个从屏幕底部弹出的对话框。它的行为类似于 BottomSheetBehavior,但它独立于屏幕上的其他内容,不嵌入布局。常用于临时对话或操作,不会影响当前界面的 UI。

  1. 布局文件:创建一个你想要在 BottomSheetDialog 中显示的布局。

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    
        <!-- 底部对话框的内容 -->
    
    </LinearLayout>
    
  2. 在 Java 或 Kotlin 中创建 BottomSheetDialog

    BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this);
    View view = getLayoutInflater().inflate(R.layout.bottom_sheet_layout, null);
    bottomSheetDialog.setContentView(view);
    bottomSheetDialog.show();
    

BottomSheetDialogFragment

BottomSheetDialogFragmentBottomSheetDialog 的子类,继承了 Fragment 的生命周期管理特性,因此适合在需要更好管理生命周期的场景中使用。使用 BottomSheetDialogFragment可以在 Fragment 中管理 BottomSheet 弹窗,并且支持在旋转屏幕等情况下保持状态。

步骤

  1. 创建一个继承 BottomSheetDialogFragment 的类

    fragment可以进行UI的更新

    public class MyBottomSheetDialogFragment extends BottomSheetDialogFragment {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return inflater.inflate(R.layout.bottom_sheet_layout, container, false);
        }
    }
    
  2. 在布局文件中创建 BottomSheet 布局: 与 BottomSheetDialog 类似,创建一个普通的布局文件(如 bottom_sheet_layout.xml)。

  3. 在 Java 中调用 BottomSheetDialogFragment

    MyBottomSheetDialogFragment bottomSheetFragment = new MyBottomSheetDialogFragment();
    bottomSheetFragment.show(getSupportFragmentManager(), bottomSheetFragment.getTag());
    

实现效果:qq_pic_merged_1727012854181

区别

  • BottomSheet:适用于需要持续显示在页面底部的小控件或内容面板,常用于多任务、底部工具栏等场景。
  • BottomSheetDialog:适合显示简短的、操作性的内容,如菜单选项、确认对话框等。
  • BottomSheetDialogFragment:适合复杂的对话框场景,特别是需要异步加载内容、动态更新或处理复杂用户交互时。


感谢您的阅读
如有错误烦请指正


参考:

  1. BottomSheet 的使用介绍
  2. 探索BottomSheet的背后秘密Bottom Sheet 在Android Design Support Libra - 掘金 (juejin.cn)

http://www.kler.cn/a/320647.html

相关文章:

  • 号卡分销系统,号卡系统,物联网卡系统源码安装教程
  • 深入解析Javascript中的this指向
  • 矩阵的对角化特征值分解
  • 【不写for循环】玩玩行列
  • vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果
  • Essential Cell Biology--Fifth Edition--Chapter one (8)
  • Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.
  • 隧道面稳定性分析MATLAB
  • 立志最细,在FreeRtos中数据传输方式及应用!!!
  • PostgreSQL 创建表,常规表、外部表、分区表区别讲解
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 1 简介
  • 前端开发必备:实用Tool封装工具类方法大全
  • vscode【实用插件】Markdown Preview Enhanced 预览 .md 文件
  • 时尚与科技的融合,戴上更轻更悦耳的QCY C30耳夹耳机,随时享受好音乐
  • 计算机毕业设计 基于Python的荣誉证书管理系统 Django+Vue 前后端分离 附源码 讲解 文档
  • python自定义日志等级
  • 企业级-pdf预览-前后端
  • 免费开源的AI 智能网盘,图片和媒体管理工具 | 极空间部署『PicHome』
  • GUI编程18:文本框、密码框、文本域
  • MT76X8、MT7621和MT7981 接NOR FALSH分区表
  • Focalboard开源项目管理系统本地Windows部署与远程访问协同办公
  • C语言读取一行字符_只需要看第四条
  • vue3中echarts柱状图横轴文字太多放不下怎么解决
  • 【深度学习】初识神经网络
  • JAVA同城服务场馆门店预约系统支持H5小程序APP源码
  • [vulnhub] pWnOS v2.0