Support Design库中的BottomSheetDialog组件使用

news/2024/7/6 0:26:33

首先来看这个组件使用的经典案例,微信公众号文章操作功能显示:


首先要知道BottomSheetDialog有两种,第一种弹出后不影响主界面交互,第二种弹出后主界面变暗不能交互,这里分别进行使用。

1.首先是普通的BottomSheetDialog:

(1)实现

使用方法是Behavier和CoordingLayout相结合。就像悬浮按钮和ToolBar等一样,这个组件要作为CoordingLayout的直接子组件并且通过设置behavior属性来告知Behavior他想要的特性。BottomSheetDialog没有具体的组件标签,所以这里直接将一个布局文件作为CoordingLayout的子组件:

<include android:id="@+id/sheet"
        layout="@layout/bottom_sheet"/>


然后看这个布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:behavior_hideable="true"
    app:behavior_peekHeight="0dp"
    app:layout_behavior="@string/bottom_sheet_behavior">
    <View
        android:background="#f00"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
    <View
        android:background="#0f0"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
    <View
        android:background="#00f"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
</LinearLayout>
重点就是几个app属性了,behavior就是核心属性了,告知自己是BottomSheet。

这里高度设置不要设置为match_parent,它不像列表的子组件布局一样能够自动调整为自适应。因为父布局CoordingLayout其实是一个FrameLayout,所以如果用match的话确实会铺满布局。

还有位置问题,因为我们想要让他在底部显示,所以这里要把layout_gravity设置为底部,默认是不会定位到底部的。

peekHeight:折叠后剩余的高度,虽然我看有一篇文档上说默认是0,但是如果我在这里不设置的话会出现控制它折叠无效果的情况。(有大神能解答一下?)

还有一个重要的属性hideable,默认是false,表示是否能够控制隐藏。只有设置为真后才能通过代码或者滑动控制折叠。


(2)state:如何对他的状态进行操作:

behavior=BottomSheetBehavior.from(findViewById(R.id.sheet));
        behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);

如上,是通过BotomSheetBehavior对象实现的,当然也可以通过getState获取状态。BottomSheetDialog有这样几种状态:

  • STATE_COLLAPSED: 默认的折叠状态

  • STATE_DRAGGING : 过渡状态,此时用户正在向上或者向下拖动bottom sheet

  • STATE_SETTLING: 视图从脱离手指自由滑动到最终停下的这一小段时间

  • STATE_EXPANDED: bottom sheet 处于完全展开的状态

  • STATE_HIDDEN : 默认无此状态(可通过app:behavior_hideable 启用此状态),启用后用户将能通过向下滑动完全隐藏 bottom sheet



2.BottomSheetDialogFragment:

很明显微信的那个效果就是这一种了,弹出后主界面变暗,点击灰色部分底部栏消失(或者通过滑动)。

这种使用起来非常简单,也不需要依赖CoordingLayout了,首先先写一个布局文件(不需要给出behavior属性),然后写一个类继承BottomSheetDialogFragment并加载布局文件:

public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.bottom2,null);
        return view;
    }
}

然后想使用的时候实例化这个类并调用show就可以了:

fragment=new CustomBottomSheetDialogFragment();
fragment.show(getSupportFragmentManager(),"dialog");


而且这个对象只有两个状态,就是弹出和隐藏。





http://www.niftyadmin.cn/n/4646361.html

相关文章

Netty内存池ByteBuf 内存回收

内存池ByteBuf 内存回收: 在前面的章节中我们有提到, 堆外内存是不受JVM 垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf 操作时, 使用完毕要对对象进行回收, 本节就以PooledUnsafeDirectByteBuf 为例讲解有关内存分配的相关逻辑。PooledUnsafeDirectByteBuf 中内存…

Android 导入库文件在主工程使用不了库文件的代码

主工程不识别这个文件 但是我明明加入这个lib库了为什么使用不了呢&#xff1f; 原因在这里 将库文件里面的build.gradle中的依赖implementation转换成api 然后sync一下 酱酱酱~~~不报错啦 是不是超级简单&#xff1f;

SocketChannel 读取ByteBuf 的过程

SocketChannel 读取ByteBuf 的过程&#xff1a; 我们首先看NioEventLoop 的processSelectedKey 方法&#xff1a; private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) {//获取到channel 中的unsafefinal AbstractNioChannel.NioUnsafe unsafe ch.unsafe…

ReactNative学习实例(八) 第三方组件TabNavigator底部导航栏

TabNavigator是github上开源的一个rn组件&#xff0c;是适用于ios和安卓两个平台的底部导航栏。 组件地址&#xff1a;https://github.com/expo/react-native-tab-navigator 1.首先通过命令行将组件引入项目&#xff1a; 进入项目根目录并执行 npm install react-native-tab-…

switch-case内不能定义变量?

1. 报错 switch&#xff08;something&#xff09; { case a: int a 0; break; default: break;   } 结果报错&#xff1a; error: cannot jump from switch statement to this case label…… 2. 错误原因 究其根本原因&#xff0c;是C的一条规则&#xff1a;在任何作用域内…

RestTemplate-记录

org.springframework.web.client.RestTemplate 1、从使用功能上看&#xff0c;是一种简化请求响应的工具类&#xff0c;从发送请求&#xff0c;到对返回的结果进行json解析。格式不对会有异常。 转载于:https://www.cnblogs.com/fateSpace/p/11319311.html

ReactNative学习实例(九)数据永久化存储AsyncStorage

官方的使用文档在这里http://reactnative.cn/docs/0.43/asyncstorage.html#content AsyncStorage使用类似于安卓中sharedpreference的存储逻辑&#xff0c;从名字中就可以看出这是异步存储。调用的所有方法返回一个Promise对象&#xff0c;但是不需要对这个对象进行操作&#x…

力扣 -- 714. 买卖股票的最佳时机含手续费

题目链接&#xff1a;714. 买卖股票的最佳时机含手续费 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码&#xff1a; // class Solution { // public: // …