Android控件BottomSheet实现底边弹出选择列表

下面是详细讲解 “Android控件BottomSheet实现底边弹出选择列表”的完整攻略。

什么是BottomSheet

BottomSheet是安卓提供的一个UI控件,可以实现在屏幕底部弹出窗口,通常用于展示一些与主要内容相关的操作选项或者附属功能。BottomSheet有两种类型:持续BottomSheet和模态BottomSheet。持续BottomSheet是可以在主UI上同时滚动的,而模态BottomSheet会覆盖主UI的一部分,只有在底部背景上滑动才能关闭。

实现步骤

  1. 在XML布局中定义BottomSheet,设置其样式和高度等属性:
<LinearLayout
  android:id="@+id/bottom_sheet"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@android:color/white"
  app:behavior_hideable="true"
  app:behavior_peekHeight=“@dimen/bottom_sheet_peek_height”
  app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

  <!-- 在这里添加Bottom Sheet显示的内容 -->

</LinearLayout>

其中app:behavior_hideable是用来控制BottomSheet是否可以隐藏,app:behavior_peekHeight是设置BottomSheet初始高度,app:layout_behavior是BottomSheet在使用时应该绑定的行为。

  1. 创建BottomSheetBehavior,绑定BottomSheet:
LinearLayout bottomSheet = findViewById(R.id.bottom_sheet);
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
  1. 设置BottomSheetBehavior的相关属性:
bottomSheetBehavior.setPeekHeight(getResources().getDimensionPixelSize(R.dimen.bottom_sheet_peek_height));
bottomSheetBehavior.setHideable(true);
bottomSheetBehavior.setSkipCollapsed(true);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);

其中,setPeekHeight()设置卡片最初状态的高度,setHideable()设置是否可以通过手势收缩BottomSheet, setSkipCollapsed()控制当BottomSheet状态为STATE_DRAGGING时,是否跳过折叠状态, 直接变成有设置的peek高度状态。

  1. 监听BottomSheet的状态改变,对BottomSheet进行相应操作:
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            // BottomSheet已隐藏,执行一些操作
        } else if (newState == BottomSheetBehavior.STATE_EXPANDED) {
            // BottomSheet在完全扩展时执行操作
        } else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
            // BottomSheet在折叠状态下执行操作
        } else if (newState == BottomSheetBehavior.STATE_DRAGGING) {
            // BottomSheet在拖拽状态下执行操作
        } else if (newState == BottomSheetBehavior.STATE_SETTLING) {
            // BottomSheet在拖拽后自动设置状态时执行操作
        }
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        // 对拖动中的BottomSheet进行操作
    }
});

我们可以在Callback中监听到BottomSheet的各种状态,并相应进行相应操作。

示例

示例1:BottomSheet实现底部菜单

在BottomSheet中定义菜单项,并为其设置点击事件:

<LinearLayout
  android:id="@+id/bottom_sheet"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@android:color/white"
  app:behavior_hideable="true"
  app:behavior_peekHeight=“@dimen/bottom_sheet_peek_height”
  app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

  <TextView
    android:id="@+id/menu_item1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/menu_item1"
    android:padding="16dp"
    android:gravity="center"
    android:background="?android:attr/selectableItemBackground"/>

  <TextView
    android:id="@+id/menu_item2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/menu_item2"
    android:padding="16dp"
    android:gravity="center"
    android:background="?android:attr/selectableItemBackground"/>

</LinearLayout>

然后在代码中为其设置点击事件,并在BottomSheetCallback中监听其状态:

LinearLayout bottomSheet = findViewById(R.id.bottom_sheet);
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);

TextView menuItem1 = findViewById(R.id.menu_item1);
menuItem1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 在此处实现点击事件
    }
});

TextView menuItem2 = findViewById(R.id.menu_item2);
menuItem2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 在此处实现点击事件
    }
});

bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            // 当BottomSheet隐藏后执行此处代码
        }
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        // 当BottomSheet在拖拽中时执行此处代码
    }
});

示例2:BottomSheet实现底部分享选择

在BottomSheet中添加分享渠道,分别定义:

<LinearLayout
  android:id="@+id/bottom_sheet"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@android:color/white"
  app:behavior_hideable="true"
  app:behavior_peekHeight=“@dimen/bottom_sheet_peek_height”
  app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

  <TextView
    android:id="@+id/share_wechat"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/share_wechat"
    android:drawableLeft="@drawable/ic_wechat"
    android:padding="16dp"
    android:gravity="center"
    android:background="?android:attr/selectableItemBackground"/>

  <TextView
    android:id="@+id/share_qq"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/share_qq"
    android:drawableLeft="@drawable/ic_qq"
    android:padding="16dp"
    android:gravity="center"
    android:background="?android:attr/selectableItemBackground"/>

  <TextView
    android:id="@+id/share_weibo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/share_weibo"
    android:drawableLeft="@drawable/ic_weibo"
    android:padding="16dp"
    android:gravity="center"
    android:background="?android:attr/selectableItemBackground"/>

  <TextView
    android:id="@+id/cancel_share"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/cancel_share"
    android:textColor="@color/colorPrimary"
    android:padding="16dp"
    android:gravity="center"
    android:background="?android:attr/selectableItemBackground"/>

</LinearLayout>

然后在代码中为其设置点击事件,并在BottomSheetCallback中监听其状态:

LinearLayout bottomSheet = findViewById(R.id.bottom_sheet);
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);

TextView shareWechat = findViewById(R.id.share_wechat);
shareWechat.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 在此处实现分享到微信代码
    }
});

TextView shareQQ = findViewById(R.id.share_qq);
shareQQ.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 在此处实现分享到QQ代码
    }
});

TextView shareWeibo = findViewById(R.id.share_weibo);
shareWeibo.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 在此处实现分享到微博代码
    }
});

TextView cancelShare = findViewById(R.id.cancel_share);
cancelShare.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    }
});

bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            // 当BottomSheet隐藏后执行此处代码
        }
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        // 当BottomSheet在拖拽中时执行此处代码
    }
});

当我们点击分享按钮后,BottomSheet被展开,当取消分享时,可以通过设置BottomSheet为隐藏状态来关闭BottomSheet。 同时使用setPeekHeight()通过改变BottomSheet的高度,控制BottomSheet的展示状态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android控件BottomSheet实现底边弹出选择列表 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • 快速解决mysql导出scv文件乱码、蹿行的问题

    快速解决MySQL导出CSV文件乱码、错位的问题,可以按照以下步骤来操作: 1. 设置字符集 首先要确定数据库字符编码与导出文件字符编码是否一致,如果不一致,那么导出的文件就很可能出现乱码。因此,在MySQL客户端登录后,可以使用以下命令设置连接字符集: SET NAMES ‘utf8’; 此命令将字符集设置为UTF-8,可以根据实际情况选择对应的字符集。 …

    html 2023年5月31日
    00
  • asp.net XML文件操作实现代码

    下面是关于“ASP.NET XML文件操作实现代码”的详细攻略。 导入 System.Xml 命名空间 在使用 XML 文件操作前,需要先导入 System.Xml 命名空间,使用如下语句: using System.Xml; 创建 XmlDocument 对象 在使用 XML 文件操作时,需要先创建 XmlDocument 对象。通过 XmlDocumen…

    html 2023年5月30日
    00
  • hbuilderx怎么设置超时时间属性?hbuilderx设置超时时间属性方法

    HBuilderX是一款基于Electron的跨平台前端开发工具,支持多种前端开发语言和框架。在使用HBuilderX进行开发时,有时需要设置超时时间属性,以便更好地控制请求的响应时间。以下是关于HBuilderX如何设置超时时间属性的攻略: HBuilderX设置超时时间属性方法 打开HBuilderX:首先,打开HBuilderX,进入需要设置超时时间属…

    html 2023年5月17日
    00
  • php xml 入门学习资料

    为了学习PHP XML,您需要进行以下步骤: 1. 学习XML基础知识 在学习PHP XML之前,您需要了解XML(可扩展标记语言)的基础知识。XML是一种用于存储和传输数据的标记语言,具有自我描述性和平台无关性。您可以使用各种在线资料,视频教程和书籍来学习XML。 2. 安装PHP 在PHP中使用XML需要您先安装PHP。如果您使用的是Linux系统,则可…

    html 2023年5月30日
    00
  • EmEditor怎么用宏 宏使用方法介绍

    EmEditor是一款功能强大的文本编辑器,支持多种编程语言和文件格式,同时还提供了宏功能,可以帮助用户自动化执行一些重复性的任务。下面是EmEditor的宏使用方法介绍: 步骤1:打开宏编辑器 打开EmEditor软件。 点击“宏”菜单,选择“编辑宏”。 在宏编辑器窗口中,您可以编写和编辑您的宏代码。 步骤2:编写宏代码 在宏编辑器窗口中,您可以使用EmE…

    html 2023年5月17日
    00
  • Ajax的概述与实现过程

    Ajax的概述与实现过程 什么是Ajax Ajax即“异步JavaScript和XML”,它是一种用于创建快速动态Web页面的技术。Ajax允许在不重新加载整个页面的情况下更新部分页面内容。使用Ajax可以提高响应速度,提高用户体验。 Ajax实现过程 创建XMLHttpRequest对象 var xmlhttp; if (window.XMLHttpReq…

    html 2023年5月30日
    00
  • 跟我学XSL(二)

    下面我来详细讲解一下“跟我学XSL(二)”的完整攻略。 前言 本文是“跟我学XSL”系列文章的第二篇,主要介绍XSLT的模板和函数,以及如何利用模板和函数实现XSLT的高级应用。 模板 模板是XSLT中最重要的概念之一,它是一种定义了如何将XML文档转换成另一种XML文档的规则。在XSLT中,模板通常以<xsl:template>元素的形式出现。…

    html 2023年5月30日
    00
  • win11玩英雄联盟乱码怎么办 win11系统lol乱码攻略

    Win11 玩英雄联盟乱码怎么办:Win11 系统 LOL 乱码攻略 如果你在 Win11 上玩英雄联盟游戏时出现了乱码,不要担心,接下来的攻略会详细介绍解决方法。 问题描述 在 Win11 上运行英雄联盟(LOL)游戏时,可能会遇到中文或其他字符出现乱码的情况,这会影响游戏体验。 解决方法 有两种方法可以解决 Win11 上英雄联盟游戏的乱码问题。 方法一…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部