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日

相关文章

  • Mybatis sql与xml文件读取方法详细分析

    “Mybatis sql与xml文件读取方法详细分析”是一个非常重要的话题,本文将从以下几个方面进行详细讲解。 Mybatis Sql与XML文件 在Mybatis框架中,Sql语句与XML文件是密切相关的。我们可以将SQL语句写在XML文件中,通过指定Mapper文件以及使用SqlSessionFactory进行读取和解析。根据Mybatis的规范,我们可…

    html 2023年5月30日
    00
  • iPhone上怎么安装deb文件的教程

    iPhone上怎么安装deb文件的教程? .deb文件是Debian软件包格式,通常用于在Debian和Ubuntu等Linux发行版中安装软件。在iPhone上,您可以使用Cydia Impactor或Filza等工具安装.deb文件。以下是关于如何在iPhone上安装.deb文件的攻略,包括以下几个步骤: 步骤1:下载.deb文件 在安装.deb文件之前…

    html 2023年5月17日
    00
  • Python中xmltodict对xml的操作方式

    Python中的xmltodict库可以将XML数据转换为Python字典,使其更易于阅读和处理。在使用xmltodict库时,通常需要进行以下步骤: 安装xmltodict库 在命令行中使用pip install xmltodict安装xmltodict库。 导入xmltodict库 在Python程序中引入xmltodict库,使用import xmlt…

    html 2023年5月30日
    00
  • phpmailer中文乱码问题的解决方法

    现在我来详细讲解“phpmailer中文乱码问题的解决方法”的完整攻略。 问题描述 在使用phpmailer发送邮件时,如果邮件正文或邮件标题中包含中文字符,则有可能出现中文乱码的情况。这个问题是由于phpmailer默认使用ISO-8859-1编码,而大部分中文字符集都是采用UTF-8编码,导致转码不正确而出现乱码的问题。 解决方法 解决phpmailer…

    html 2023年5月31日
    00
  • 解决VuePress页面乱码问题

    下面是解决VuePress页面乱码问题的完整攻略: 问题背景 在使用VuePress时,可能会遇到中文显示乱码的问题。这是由于VuePress默认的编码为UTF-8,而网页在浏览器中的编码可能为其他编码格式,导致中文字符无法正常显示的情况。 解决方案 方案一:设置VuePress的编码格式 可以在VuePress的配置文件中指定网站的编码格式为UTF-8,代…

    html 2023年5月31日
    00
  • Android高级xml布局之输入框EditText设计

    当我们在Android应用程序开发中设计界面时,输入框(EditText)是经常用到的控件之一。EditText可以让用户在应用程序中输入文本、数字、邮箱等。如何设计好EditText控件,让用户在我们的应用程序中可以更加方便地输入内容呢?下面就是关于Android高级xml布局之输入框EditText设计的完整攻略。 设置EditText的属性 输入类型 …

    html 2023年5月30日
    00
  • 如何拍好月亮?拍摄月亮要做什么准备?

    以下是“如何拍好月亮?拍摄月亮要做什么准备?”的完整攻略: 如何拍好月亮?拍摄月亮要做什么准备? 月亮是一个非常美丽的天体,拍摄月亮可以得到非常漂亮的照片。下面是一些拍摄月亮的技巧和准备工作,可以帮助用户拍摄出高质量的月亮照片。 技巧1:选择合适的拍摄时间 用户需要选择合适的拍摄时间。月亮的亮度和位置会随着时间的变化而变化。用户可以在月亮升起或落下的时候拍摄…

    html 2023年5月18日
    00
  • 网站建设中怎么打造亮点

    以下是“网站建设中怎么打造亮点”的完整攻略: 网站建设中怎么打造亮点? 在网站建设中,打造亮点可以吸引用户的注意力,提高用户的体验和满意度。以下是一些关于如何打造亮点的技巧和步骤,可以帮助用户更好地建设网站。 技巧1:设计独特的页面布局 在网站建设中,设计独特的页面布局可以吸引用户的注意力。用户可以使用不同的颜色、字体、图片等元素来设计页面布局,以便更好地突…

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