项目中用到了Dialog和BottonSheetDialog,由于特殊需求,Dialog需要从屏幕左边弹出,而BottonSheetDialog是Android提供的底部窗口控件,从屏幕底部弹出,下面分别介绍一下两种Dialog自定义布局的方法和相关使用介绍

1、Dialog

dialog自定义布局,创建一个MyDialog类并继承自Dialog,在构造函数中加载布局,同时,使用接口将点击事件暴露给调用者,下面是相关代码:

public class MyDialog extends Dialog {
    private ListAdapter listAdapter;
    private ItemClickListener itemClickListener;
    //    style引用style样式
    public MyDialog(Context context, int width, int height, int style, final ItemClickListener listener) {
        super(context, style);
        this.itemClickListener = listener;//暴露给外界的接口
        View view = View.inflate(getContext(),R.layout.dialog_layout,null);
        ListView listView = view.findViewById(R.id.list_view);
        List<String> list = new ArrayList<>();
        list.add("全部");
        list.add("未分组");
        list.add("生活");
        list.add("学习");
        list.add("工作");
        // 使用ArrayAdapter适配器
        listAdapter = new ArrayAdapter<>(context,
                android.R.layout.simple_list_item_1, android.R.id.text1, list);
        listView.setAdapter(listAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String kind = (String) listAdapter.getItem(i);
                if(itemClickListener != null){
                    itemClickListener.onClick(kind);
        setContentView(view);
        Window window = getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.gravity = Gravity.START;
        params.width = 500;
        window.setAttributes(params);//通过window来设置窗口的位置,Start就是屏幕左侧,设置宽度为500px
    //自定义接口
    interface ItemClickListener{
        void onClick(String s);

布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="160dp"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardCornerRadius="10dp"
    app:cardElevation="0dp"
    app:cardBackgroundColor="#ffffff">
    <RelativeLayout
        android:layout_width="160dp"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="便签分组"
            android:textSize="17sp"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="20dp"/>
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_below="@+id/title"
            android:background="#000000"/>
        <ListView
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/title"/>
    </RelativeLayout>
</androidx.cardview.widget.CardView>

2、BottomSheetDialog

BottomSheetDialog已经给我们做了非常好的封装,所以使用非常方便,我将BottomSheetDialog的初始化和显示放在一个函数中,调用该函数即可,下面是相关代码:

private void showBottomSheetDialog() {
        if(bottomSheetDialog != null) {//已经初始化就不再重新初始化了
            bottomSheetDialog.show();
            return ;
        bottomSheetDialog = new BottomSheetDialog(this);
        View view = LayoutInflater.from(this).inflate(R.layout.dialog_bottom_sheet_layout, null);//加载自定义布局
        ImageView close = view.findViewById(R.id.close);
        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                bottomSheetDialog.cancel();
        CardView one = view.findViewById(R.id.one);
        initListener(1,one);//设置点击事件
        bottomSheetDialog.setContentView(view);
        bottomSheetDialog.setCanceledOnTouchOutside(true);//设置点击窗口外是否关闭窗口
        bottomSheetDialog.getBehavior().setDraggable(false);//设置是否可以向下滑动来关闭窗口
        bottomSheetDialog.show();

作者 阿玛尔
原文地址

BottomSheetDialog使用解析 Android Support Library 23.2里的 Design Support Library新加了一个Bottom Sheets控件,Bottom Sheets顾名思义就是底部操作控件,用于在屏幕底部创建一个可滑动关闭的视图,可以替代对话框和菜单。其中包含Bo... public class MyDialog extends Dialog { private ListAdapter listAdapter; private ItemClickListener itemClickListener; // style引用style样式 public MyDialog(Context context, int width, int height, int style, final ItemClickListener listener) { super(context, 2.扯扯原因 谷歌在2021年底宣布韩国谷歌商店应用支持多种支付方式,但前提是得满足一些开发规范,并且要求使用SheetBottom来开发支付弹出框,我也是第一次接触这玩意儿,所以就开始怼啊,怼完发现还真比自定义的底部弹出Dialog好使。就想分享下这几天的开发过程以及踩的坑,希望能够帮到你。 3.细细分说 继续解决标题中问题的童鞋: 圆角矩形实现:3.2+3.3 展开状态:3.4(直接搜behavior) 3.1 SheetBottom依赖 只要在App级build.gradl 有一个VBA应用的例子中有这么一句代码:     ThisWorkbook.DialogSheets("Start").Show 我找了整个工程都没有看见有“Start”这个sheet,但是程序能运行并且有对话框显示,请问这个对话框如何才能找到? 通过研究,发现原来这儿的DialogSheets实际上就是MS EXCEL 5.0 对话框,这个对 import android.app.Dialog; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.util. Android 6.0新控件 BottomSheetDialog | 底部对话框 介绍及使用详情extends AppCompatDialog Base class for Dialogs styled as a bottom sheet 基于Dialog样式的一个底部对话框 先看看效果对于弹出的内容完全由自己来掌控,想实现什么样子就实现什么样子,很灵活使用方法BottomSheet 最近重构项目,想把之前的一些控件替换成BottomSheetDialog。最后选用的是更加方便的BottomSheetDialogFragment。也遇到了很多坑,写出来分享一下。 1.BottomSheetDialogFragment背景圆角设置 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android: 由于BottomSheetDialog内部setContentView时会添加进一个height=content_wrap的容器里,所以默认展示出来会是wrap,除非内容区域足够展示全屏,于是我们可以通过修改内部容器的高度来达到全屏。 关键源码如下: @Override public void setContentView(View view) { super.setContentView(wrapInBottomSheet(0, view, null)); @Override 大家都知道IOS的很多菜单都是从底部弹出的,这种展示方式还是很好看的,而丑爆的Android默认弹框一直都是大家一定要摒弃的,那么我们Android如何做出相应效果的弹框。下面我们就介绍这种做法。 底部弹出框布局 dialog_goods_sku_layout.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout... MD风格的底部弹窗,比自定义dialog或popupwindow使用更简单,功能也更强大。 其实细分来说,是BottomSheetBottomSheetDialogBottomSheetDialogFragment BottomSheet 与主界面同层级关系,可以事件触发,如果有设置显示高度的话,也可以拉出来,且不会影响主界面的交互。 <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.